我正在研究灵活的数组成员。我根据我正在学习的书中的一个2行示例编写了下面的代码。该代码使用gcc -Wall
编译时没有错误,并且执行时也没有错误。
但是,我不知道这个malloc
调用末尾的(n
)是用来做什么的。我假设,如果我在灵活数组中存储一个字符串,那么我应该对该字符串调用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 = %dn", n, array[i]->chars, array[i]->len);
}
return 0;
}
是的,您需要分配足够的内存来存储字符串。所以你的案子应该是
strlen(input_str)+1.
您正在做的是写入未分配的内存并调用未定义的行为。代码可能有效,但它是错误的。
您的malloc调用中也有一个拼写错误(?)。应该是
struct vstring *str = malloc( sizeof(struct vstring) + n );
请不要忘记,使用scanf调用输入超过19个字符也会导致未定义的行为,因为您会写出超出数组范围的内容。使用%19s
作为转换规范可以避免这种情况。您还应该检查scanf()
是否成功。