在我的程序中,我正在尝试使用malloc函数调整数组大小。
#include <stdio.h>
int main(void)
{
int list[5],i;
int* ptr = &list;
for(i = 0; i < 5; i++)
list[i] = i;
for(i = 0; i < 5; i++)
printf("%d\n", list[i]);
printf("----------------------------------------\n");
ptr = malloc(10);
for(i = 0; i < 10; i++)
list[i] = i;
for(i = 0; i < 10; i++)
printf("%d\n", list[i]);
}
编译程序时,我收到两条警告:
searock @ searock-desktop:〜/ C $ cc malloc.c -o malloc
malloc.c:在函数'main'中:
malloc.c:6:警告:从不兼容的指针类型初始化
malloc.c:16:警告:内置函数'malloc'的不兼容的隐式声明
我的程序运行正常。我不明白为什么编译器会给我这个错误?
我应该改变方法吗?
编辑1:然后如何释放内存?我应该免费使用(列表);或免费(ptr);
编辑2:更新代码
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int list[5],i;
int* ptr = malloc(5 * sizeof(int)); //&list;
for(i = 0; i < 5; i++)
ptr[i] = i;
for(i = 0; i < 5; i++)
printf("%d\n", ptr[i]);
printf("----------------------------------------\n");
ptr = realloc(ptr, 10 * sizeof(int)); //malloc(10);
for(i = 0; i < 10; i++)
ptr[i] = i;
for(i = 0; i < 10; i++)
printf("%d\n", ptr[i]);
free(ptr);
}
感谢。
答案 0 :(得分:5)
您实际上并未重新分配list
。 list
仍然是5
字节,而ptr
指向10
字节数组。
做这样的事情:
int* list = malloc(5 * sizeof(int));
...
list = realloc(list, 10 * sizeof(int));
...
现在,当你说:
int* ptr = &list;
您没有为list
创建“引用”;在这种情况下(不是一般),它与:
int* ptr = list;
这意味着ptr[3]
和list[3]
相同int
,但是ptr
指向新缓冲区不会使list
指向新的缓冲区也是如此。如果这是C ++,那么声明ptr
你想的方式的语法(我认为):
int (&ptr)[5] = list;
无论如何,无论如何,你都不能realloc
自动分配缓冲区。这不起作用:
int buffer[5];
buffer = realloc(buffer, 10 * sizeof(int));
realloc
可能会导致分段错误,并且C不允许将新指针分配给buffer
。
最后,从其他答案中窃取,您需要#include <stdlib.h>
使用malloc
和朋友;否则,它将被隐式声明返回int
而不是指针,产生警告并且没有充分理由搞砸了64位兼容性。
答案 1 :(得分:4)
是的,malloc分配10个字节,但10个整数是10 *(sizeof integer)字节。
使用
malloc(10*sizeof(int));
答案 2 :(得分:3)
第一个警告是因为您试图在int *
中存储指向列表的指针,该列表是一个数组。您需要int **
来保存指向列表的指针。
第二个警告是因为您从未包含定义malloc
的头文件。如果您#include <stdlib.h>
该警告将消失。
你还需要解决其他几个问题,似乎你可能需要在C上阅读更多内容。
答案 3 :(得分:3)
解释第一个警告:
int* ptr = &list;
ptr
的类型为int*
,但&list
的类型为int (*)[5]
(即指向五个整数数组的指针。
list
和&list
具有相同的指针值,但它们具有不同的类型。如果你想得到一个指向数组中初始元素的指针,你应该只使用数组的名称list
,它会在大多数情况下衰减到指向其初始元素的指针(例外情况是{ {1}}或&
已应用于数组。)
正如其他人已经解释的那样,第二个警告是因为在sizeof
中声明malloc
,您需要分配<stdlib.h>
而不是10 * sizeof(int)
个字节,并且您需要如果要使用分配的内存,请小心使用10
,而不是ptr
(因为list
仍然命名原始数组)。
答案 4 :(得分:1)
编译器在第6行给出警告,因为您将ptr
分配给int
数组的指针而不是指向int
的指针。用
int* ptr = list;
会做你想做的事。
答案 5 :(得分:1)
在我的程序中,我正在尝试使用malloc函数调整数组大小。
我认为你不能调整在堆栈内存上分配的数组的大小。当你说
int list[5]
,您已为堆栈中的5个整数分配内存。无论你做什么,你都无法做到5到10.直到你的程序死亡,记忆仍将存在。你不能释放那个记忆。
让我们说你做的事情
当你执行ptr = malloc()
时,你的列表仍然指向你有五个连续整数的堆栈内存。
让我们说即使你做了像
这样的事情 list = malloc(10)
[实际上这应该是list = (int *)malloc(10) * sizeof(int)
]你刚刚更改了变量列表的值,原始内存仍然位于堆栈内存中。