动态内存分配和结构

时间:2013-06-11 07:22:25

标签: c arrays dynamic-allocation

所以我正在学习结构,并且正在尝试输入带有动态内存分配的字符串。

这是我到目前为止所做的:

  typedef struct{
    char foo[81]; 
  } TYPE;


 void function(TYPE get[]){
   char a[81];
   scanf("%s", a);

   get->foo = malloc(strlen(a)+1*sizeof(char)); //this line produces an error that it is not assignable

   strcpy(get->foo,a);

   return; 

 }

我不确定该声明有什么问题,任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:8)

foo是一个数组对象而不是指针,因此您无法使用该操作

get->foo = (char*)calloc(strlen(a)+1,sizeof(char));

您正尝试将(void *)分配给类型char[81],这完全不兼容。在这种情况下,Lvalue应该是指针。

答案 1 :(得分:5)

你必须声明你foo是一个字符指针。

typedef struct{
    char * foo; 
} TYPE;

答案 2 :(得分:4)

您正在尝试为foo分配内存并为其分配已分配内存的地址。那不行。 foo是一个数组,并且已经分配了一个内存(81 char个元素。)因为它是一个数组,所以你不能为它分配一个地址。

您想要的是将a字符串复制到foo

scanf("%s", a);
strcpy(get->foo, a);

但是,您可以通过将扫描和复制操作实际限制为81个字符来做得更好,这样您就不会在fooa的末尾写字:

fgets(a, 81, stdin);
strncpy(get->foo, a, 81);

咨询fgets()strncpy()的文档是一个好主意(在那里你可以找到为什么你可以在调用fgets()时指定81而不是80。)你应该总是小心不要写过数组的末尾。