C++ malloc 中的错误
C++ error in malloc
我是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));
这里你有两个问题:
malloc
是C
,而不是C++
。是的,malloc
在C++
中受支持,但为了与旧代码的 backwawrds 兼容性。不要使用它。- 将
numberOfItems
转换为指针,然后将指针乘以整数。这是未定义的行为。你的编译器甚至可能在这里做正确的事情,但你无法知道,也不能相信你得到的任何结果。
让我们继续:
for(int i=0;i<numberOfItems;i++){
*array = i;
array++;
i++;
}
for
声明看起来不错。你初始化一个整数i
0
,然后使用++
运算符递增它,只要它小于numberOfItems
,这很好。但是:
- 您在循环中再次递增
i
。这意味着你实际上将i
递增 2,所以i
0, 2, 4, 6, 8, 10
,你的循环只执行 5 次。 - 您递增
array
指针。虽然技术上完全有效的代码,但这会进一步咬你。 - 因此,您将值 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++;
}
- 你对
i
执行与第一个循环相同的操作。这一次,这拯救了你的脖子,因为... - 。由于指针
array
已在第一个循环中递增,因此现在继续在内存中向下移动5*sizeof(int)
个字节。因此,您不会打印在第一个循环中设置的值(这可能是您的意图),而是驻留在最初分配的内存后半部分的未初始化值array
.
相关文章:
- 当我尝试加载内核模块时,如何修复C++中的这个 malloc() 错误?
- 在C++中创建队列 - 什么是 malloc 错误?
- 错误:malloc:对象 0x7f9edf504080 的 *** 错误:未分配正在释放的指针
- C++程序错误:malloc():内存损坏
- 瓦尔格林德错误 - 地址0x0不是堆叠的 malloc'd 或自由的
- 如何修复对象在释放后可能修改的malloc错误
- C++ malloc 中的错误
- Malloc后的自由功能错误
- C++编译错误,"malloc: *** error for object: pointer being freed was not allocated"
- 如果在 C++ 中的 malloc() 之后调用 free() 则会出现错误
- malloc: 对象 0x00 的 *** 错误:未分配正在释放的指针
- 使用 malloc 而不是 new 会导致 free():指针错误无效
- 使用 std::shared_ptr 时出现 malloc 错误
- 使用Malloc C 时C2440错误
- 库"curl_easy_cleanup()"导致 malloc 错误 (C++)
- 解析 csv 文件,"malloc: *** error for object 0x7ffeeb4f4b80: pointer being freed was not allocated"出现此错误
- malloc: 对象 0x10003b3c4 的 *** 错误:未分配正在释放的指针 *** 在malloc_error
- 无法解决 opencv 代码中的 malloc 错误
- 错误:malloc():排序的比较函数内存损坏
- c++错误:' malloc '未在此范围内声明