gpt4 book ai didi

c - 调整整数数组大小时发出警告

转载 作者:行者123 更新时间:2023-12-04 03:49:23 27 4
gpt4 key购买 nike

在我的程序中,我试图使用 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: In function ‘main’:
malloc.c:6: warning: initialization from incompatible pointer type
malloc.c:16: warning: incompatible implicit declaration of built-in function ‘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);
}

谢谢。

最佳答案

你实际上并没有重新分配 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可能会导致段错误,并将新指针分配给 buffer C 不允许。

最后,从其他答案中窃取,您需要 #include <stdlib.h>使用 malloc和 friend ;否则,它将被隐式声明返回 int而不是一个指针,产生警告并无缘无故地破坏 64 位兼容性。

关于c - 调整整数数组大小时发出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3642970/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com