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

Sea*_*ock 2 c malloc

在我的程序中,我试图使用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)

谢谢.

Joe*_*ams 5

你实际上并没有重新分配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位兼容性.