抱歉我的英语不好但我有一个问题要问你。我写了一个带有双指针数组的程序来保存内存,但我有一个问题。在coloc名称指针的calloc中是否正确?随着' frutta'该计划有效。在此先感谢您的帮助!
#include <stdio.h>
#include <stdlib.h>
void inserimento (char **, int);
void output (char **, int);
int main ()
{
char **frutta;
int n,i;
printf("Quanta frutta vuoi inserire?\n");
scanf("%d",&n); //with this I write here number of elements
//(with 4 for example I write 4 fruit names)
frutta=(char **)calloc(frutta,sizeof(char*));//calloc for col. Name pointer
//here is correct?
for (i=0;i<n;i++)
frutta[i]=(char *)calloc(n,sizeof(char));//calloc for row
inserimento (frutta,n);
output (frutta,n);
for (i=0;i<n;i++)
free(frutta[i]);
free(frutta);
}
void inserimento (char **frutta, int n)
{
int i;
for (i=0;i<n;i++)
scanf("%s",frutta[i]);//here add name fruits
}
void output (char **frutta, int n)
{
int i;
for (i=0;i<n;i++)
printf("%s",frutta[i]);//here print name fruits
}
答案 0 :(得分:0)
//here is correct?
for (i=0;i<n;i++)
不,这不是。要做到正确,你必须为n
指针分配内存。 (您没有成功完成第一个calloc
。
frutta=calloc(n,sizeof(char*))
语法之前错了。你有警告/错误。
确保使用所有-Wall
标志编译程序。不要忘记检查你得到的每一个警告。这将有助于你解决这些问题。
来自标准 7.22.3.2
void *calloc(size_t nmemb, size_t size);
calloc
函数为 nmemb对象数组分配空间, 每个尺寸大小。空间初始化为所有位零
还有两件事: -
不要转换calloc
。
检查calloc
。
使用完毕后释放已分配的内存。
是的!我已经提出了一个额外的观点。
答案 1 :(得分:0)
frutta=(char **)calloc(frutta,sizeof(char*));
这不正确。出于某种原因存在编译器警告。 calloc 需要整数作为第一个参数,如下所述:
void * calloc(size_t nmemb,size_t size);
答案 2 :(得分:0)
这绝对不正确。 calloc
的第一个参数是成员数量,并且您将指针传递给它,此时指针不会有定义的值。
frutta=(char **)calloc(frutta,sizeof(char*));
相反,您希望使用刚刚读过的n
。
frutta=calloc(n,sizeof(char*));
其次,对于下一个级别,如果您要在那里存储实际字符串,则可能需要比n
大很多的东西。您的4示例只会为您提供空间来存储3个字符长的字符串,因为您需要为NUL终止字符包含空格。
frutta[i]=(char *)calloc(n,sizeof(char));
您也不应该投放calloc
(或malloc
)的返回值,因为它不需要,并且可以隐藏代码中的错误。