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

时间:2010-09-04 15:57:38

标签: 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]);
}

编译程序时,我收到两条警告:

   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);
}

感谢。

6 个答案:

答案 0 :(得分:5)

您实际上并未重新分配listlist仍然是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的指针。用

替换第6行
int* ptr = list;

会做你想做的事。

答案 5 :(得分:1)

  

在我的程序中,我正在尝试使用malloc函数调整数组大小。

我认为你不能调整在堆栈内存上分配的数组的大小。当你说 int list[5],您已为堆栈中的5个整数分配内存。无论你做什么,你都无法做到5到10.直到你的程序死亡,记忆仍将存在。你不能释放那个记忆。

让我们说你做的事情

当你执行ptr = malloc()时,你的列表仍然指向你有五个连续整数的堆栈内存。

让我们说即使你做了像

这样的事情

list = malloc(10) [实际上这应该是list = (int *)malloc(10) * sizeof(int)]你刚刚更改了变量列表的值,原始内存仍然位于堆栈内存中。