所以我正在学习结构,并且正在尝试输入带有动态内存分配的字符串。
这是我到目前为止所做的:
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;
}
我不确定该声明有什么问题,任何帮助都会受到赞赏。
答案 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个字符来做得更好,这样您就不会在foo
或a
的末尾写字:
fgets(a, 81, stdin);
strncpy(get->foo, a, 81);
咨询fgets()和strncpy()的文档是一个好主意(在那里你可以找到为什么你可以在调用fgets()时指定81而不是80。)你应该总是小心不要写过数组的末尾。