我正在接近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个整数并打印“添加更多空格......”,此时程序终止,而不是要求额外的三个整数并打印输入。
任何帮助都会很好。 :)谢谢!
答案 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/这些网站对于初学者来说真的是一个非常重要的网站,我希望你喜欢并且我们有任何疑问可以帮助你