我正在研究灵活的阵列成员。我根据我正在研究的书中的2行示例编写了下面的代码。代码使用gcc -Wall
进行编译,没有错误,并且无错误地执行。
但是,我不知道此n
电话结尾处的{malloc
}是什么。我假设如果我将字符串存储在灵活数组中,我应该在字符串上调用strlen()
并使用返回的值(n
)。无论我分配给(n
)什么值,代码似乎都有效,甚至在没有(n
)时也能正常工作。
struct vstring *str = malloc(sizeof(struct vstring) + n);
是否需要价值?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct vstring{
int len;
char chars[]; /* c99 flexible array member to store a variable string */
};
int main()
{
char input_str[20];
int n = 0; /* what should n be it doesn’t seem to matter what value I put in here */
struct vstring * array[4]; /* array of pointers to structures */
int i = 0;
while ( i < 4 )
{
printf("enter string :");
scanf("%s",input_str);
struct vstring *str = malloc(sizeof(struct vstring) + n );
strcpy(str->chars,input_str);
str->len = strlen(input_str);
array[i] = str;
i++;
}
for ( i = 0 ; i < 4 ; i++) {
printf("array[%d]->chars = %s len = %d\n", n, array[i]->chars, array[i]->len);
}
return 0;
}
答案 0 :(得分:2)
是的,你需要分配足够的内存来存储你的字符串。所以你的案子应该是
strlen(input_str)+1.
您正在做的是写入未分配的内存并调用未定义的行为。代码可能有效,但这是错误的。
你的malloc电话中也有拼写错误(?)。它应该是
struct vstring *str = malloc( sizeof(struct vstring) + n );
并且不要忘记,使用scanf调用输入超过19个字符也会导致未定义的行为,因为您将写出数组的边界。您可以使用%19s
作为转换规范来避免这种情况。您还应该检查scanf()
是否成功。