2

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

这是我到目前为止所拥有的:

  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; 

 }

我不确定该声明有什么问题,任何帮助将不胜感激。

4

3 回答 3

8

foo是一个数组对象,而不是一个指针,所以你不能使用该操作

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

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

于 2013-06-11T07:27:42.087 回答
5

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

typedef struct{
    char * foo; 
} TYPE;
于 2013-06-11T07:24:44.987 回答
4

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

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

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

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

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

查阅 fgets()strncpy()的文档是一个好主意(在那里你可以找到为什么你可以在 fgets() 的调用中指定 81 而不是 80。)你应该始终小心不要写到结尾数组。

于 2013-06-11T07:34:14.600 回答