将内存分配给指向字符串的双指针数组?

时间:2017-12-12 17:52:01

标签: c arrays

抱歉我的英语不好但我有一个问题要问你。我写了一个带有双指针数组的程序来保存内存,但我有一个问题。在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
}

3 个答案:

答案 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对象数组分配空间,   每个尺寸大小。空间初始化为所有位零

还有两件事: -

  1. 不要转换calloc

  2. 的返回值
  3. 检查calloc

  4. 的返回值
  5. 使用完毕后释放已分配的内存。

  6. 是的!我已经提出了一个额外的观点。

答案 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)的返回值,因为它不需要,并且可以隐藏代码中的错误。