c问题中的内存分配

时间:2011-08-18 14:24:20

标签: c memory allocation

我正在接近Mike McGrath撰写的关于c编程的介绍性书籍的结尾,该书名为“简单的C编程”。我想我会在本书之后通过外观来了解更多内容。无论如何,我正在使用内存分配并且我编写了这个演示程序,但是当我尝试运行它时错误已关闭:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int i, *arr;

    arr = calloc(5, sizeof(int));
    if(arr!=NULL)
    {
        printf("Enter 5 integers, seperated by a space:");
        for(i=0; i<5; i++) scanf("%d", &arr[i]);
        printf("Adding more space...\n");
        arr = realloc(8, sizeof(int));
        printf("Enter 3 more integers seperated by a space:");
        for(i=5; i<8; i++) scanf("%d", &arr[i]);
        printf("Thanks.\nYour 8 entries were: ");
        for(i=0; i<8; i++) printf("%d, ", arr[i]);
        printf("\n");
        free(arr);
        return 0;
        }
    else {printf("!!! INSUFFICIENT MEMORY !!!\n"); return 1; }
}

警告讯息:

|13|warning: passing argument 1 of 'realloc' makes pointer from integer without a cast|
c:\program files\codeblocks\mingw\bin\..\lib\gcc\mingw32\4.4.1\..\..\..\..\include\stdlib.h|365|note: expected 'void *' but argument is of type 'int'|
||=== Build finished: 0 errors, 1 warnings ===|

结果编译要求输入5个整数并打印“添加更多空格......”,此时程序终止,而不是要求额外的三个整数并打印输入。

任何帮助都会很好。 :)谢谢!

6 个答案:

答案 0 :(得分:7)

你没有按照你应该的方式使用realloc

/* 8 is not valid here. You need to pass the previous pointer. */
arr = realloc(8, sizeof(int));

尝试:

tmp = realloc(arr, 8 * sizeof(*arr));
if (NULL != tmp)
    arr = tmp;

顺便说一下,你的程序看起来很麻烦,这使得它很难阅读。也许偶尔留空线?

答案 1 :(得分:1)

您需要将指针传递给要调整大小的内存:

tmp = realloc(arr, 8 * sizeof(int));
if (NULL != tmp)    
   arr = tmp;

答案 2 :(得分:0)

realloc的第一个参数应该是先前分配的指针

答案 3 :(得分:0)

查看realloc的工作原理 - 您必须将原始指针传递给它:

int * tmp = realloc(arr, 8 * sizeof(int));
if (tmp)
{
  arr = tmp;
}
else // Error!

答案 4 :(得分:0)

您使用realloc是错误的。

    // ptr: Pointer to a memory block previously allocated with malloc, calloc or
    // realloc to be reallocated.
    void * realloc ( void * ptr, size_t size );

您应该使用realloc(arr, 8 * sizeof(int));

答案 5 :(得分:-1)

拳头你必须学习使用realloc的方法。 第一次警告您在屏幕上看到的原因

passing argument 1 of 'realloc' makes pointer from integer without a cast
 int i, *arr;          
 arr = calloc(5, sizeof(int)); \\ Not the right way 
 arr = (int *) calloc (5,sizeof(int)); \\ makes sense

你必须在分配之前键入强制转换由calloc返回的指针。这就是为什么没有强制转换就得到警告的原因。 注意

char *arr ; arr = (char *) realloc (5,sizeof(char))
double *char: arr =(double *) realloc (5,sizeof(double))

我猜你明白了。把它转换成你要分配的指针类型。因为calloc返回void指针,你必须在使用它之前输入你想要的数据类型

至于我的知识

for(i=0; i<5; i++) scanf("%d", &arr[i]);  \\ this is not the way to use pointers
this would be mostly used in arrays !

这是使用指针的方法

      *(arr+1) or *(arr+any_variable) \\ 

并记住你的定义arr作为整数指针,它将其地址递增2

example arr pointing to 3000 memory location after *(arr+1)
points to 3002 location and if arr pointer is ,char *arr, then
arr pointing to 3000 then *(arr +1 ) now it will point to 3001 location
same for double by 8 and for float 4 .

1并不意味着1意味着增加指针的指针大小。 好吧,我从未注意到这种指针语法

     &arr[i]

如果这也是使用指针的方式,那么我很高兴接受它我学会了另一种访问指针的方法

   but think of using these *(arr+i) mostly 

你也可以使用

 (int *) calloc(5, sizeof(int))
 \\ the number of bytes allocated by it is 5 * sizeof(int) = 5*2 =10 

感谢。

请仔细阅读 http://www.cplusplus.com/reference/clibrary/cstdlib/calloc/这些网站对于初学者来说真的是一个非常重要的网站,我希望你喜欢并且我们有任何疑问可以帮助你