C++ malloc 中的错误

C++ error in malloc

本文关键字:错误 malloc C++      更新时间:2023-10-16

我是C/C++的新手,并试图测试我对指针的理解。为此,我创建了以下简单程序来创建整数数组来存储 10 个数字并将其打印出来。

#include<iostream>
#include <cstdlib>
// #include <cstdint> 
int main(){
int numberOfItems = 10;
int *array;
// int *array = malloc((int*)numberOfItems*sizeof(int));
array = malloc((int*)numberOfItems*sizeof(int));
for(int i=0;i<numberOfItems;i++){
*array = i;
array++;
i++;
}
std::cout<<"The size of the array is : "<<sizeof(array)<<std::endl;
for(int i=0;i<numberOfItems;i++){
std::cout<<*array<<std::endl;
array++;
i++;
}
return 0;
}

我使用命令运行程序g++ main.cpp. 但它给了我以下错误:

主.cpp:8:47:错误:二进制"运算符*"类型"int*"和"长无符号整数"的操作数无效 数组 = malloc((int*)numberOfItems*sizeof(int));

尝试和失败我试图将 int 更改为uint64_t但它仍然给了我类似的错误。

我不明白我做错了什么。

该错误是由于以下行中的语法不正确

array = malloc((int*)numberOfItems*sizeof(int));

正确的语法如下:

array = (int*) malloc(numberOfItems*sizeof(int));

您需要对malloc的返回值进行类型转换,因为它返回一个(void *)指针。因此,您需要指定访问内存时要指向的数据类型。

让我们逐步浏览您的代码:

int *array;
array = malloc((int*)numberOfItems*sizeof(int));

这里你有两个问题:

  1. mallocC,而不是C++。是的,mallocC++中受支持,但为了与旧代码的 backwawrds 兼容性。不要使用它。
  2. numberOfItems转换为指针,然后将指针乘以整数。这是未定义的行为。你的编译器甚至可能在这里做正确的事情,但你无法知道,也不能相信你得到的任何结果。

让我们继续:

for(int i=0;i<numberOfItems;i++){
*array = i;
array++;
i++;
}

for声明看起来不错。你初始化一个整数i0,然后使用++运算符递增它,只要它小于numberOfItems,这很好。但是

  1. 您在循环中再次递增i。这意味着你实际上将i递增 2,所以i0, 2, 4, 6, 8, 10,你的循环只执行 5 次。
  2. 您递增array指针。虽然技术上完全有效的代码,但这会进一步咬你。
  3. 因此,您将值 0、2、4、6 和 8 写入内存中,位于array指针的初始位置,并进一步向下1*sizeof(int)2*sizeof(int)3*sizeof(int)4*sizeof(int)个字节。

下一个问题:

std::cout<<"The size of the array is : "<<sizeof(array)<<std::endl;

这不会打印您要打印的内容。array是指针类型,因此sizeof(array)将返回指针的大小,该大小可能是 4 或 8 个字节,具体取决于应用程序/操作系统的位数。

最后但并非最不重要的是您的最后一个循环:

for(int i=0;i<numberOfItems;i++){
std::cout<<*array<<std::endl;
array++;
i++;
}
  1. 你对i执行与第一个循环相同的操作。这一次,这拯救了你的脖子,因为...
  2. 。由于指针array已在第一个循环中递增,因此现在继续在内存中向下移动5*sizeof(int)个字节。因此,您不会打印在第一个循环中设置的值(这可能是您的意图),而是驻留在最初分配的内存后半部分的未初始化值array.