在我的程序中,我试图使用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]);
}
Run Code Online (Sandbox Code Playgroud)
在编译程序时,我得到两个警告:
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);
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
你实际上并没有重新分配list. list仍然是5字节,而ptr指向10 字节数组.
做这样的事情:
int* list = malloc(5 * sizeof(int));
...
list = realloc(list, 10 * sizeof(int));
...
Run Code Online (Sandbox Code Playgroud)
现在,当你说:
int* ptr = &list;
Run Code Online (Sandbox Code Playgroud)
你没有创建一个"参考" list; 在这种情况下(不是一般),它是相同的:
int* ptr = list;
Run Code Online (Sandbox Code Playgroud)
这意味着ptr[3]并且list[3]是相同的int,但是ptr指向新的缓冲区也不会list指向新的缓冲区.如果这是C++,那么声明ptr你思考方式的语法(我认为):
int (&ptr)[5] = list;
Run Code Online (Sandbox Code Playgroud)
无论如何,无论如何,你不能realloc自动分配缓冲区.这不起作用:
int buffer[5];
buffer = realloc(buffer, 10 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
将realloc可能会导致段故障,并赋予新的指针buffer没有被允许C.
最后,从其他答案中窃取,你需要和朋友#include <stdlib.h>一起使用malloc; 否则,它将被隐式声明返回一个int而不是一个指针,产生警告并且没有充分理由搞砸了64位兼容性.