2014-09-27 107 views
0

我正在学习灵活的数组成员。我根据我正在学习的书中的2行示例编写了下面的代码。该代码与gcc -Wall一起编译,没有错误,并且执行时没有错误。灵活的char数组成员结构

但是我不知道这个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 = %d\n", n, array[i]->chars, array[i]->len); 
    } 

    return 0; 
} 
+0

使用'fgets'字符串它更好:) – 0decimal0 2014-09-27 13:37:52

回答

2

是的,你需要分配足够的内存来存储你的字符串。所以在你的情况n应该是

strlen(input_str)+1. 

你在做什么是写入未分配的内存并调用未定义的行为。代码可能工作,但它是错误的。

您的malloc调用中还有一个错字(?)。它应该是

struct vstring *str = malloc(sizeof(struct vstring) + n); 

而且不要忘记,与scanf函数调用输入超过19个字符也将导致不确定的行为,你会写你的数组的边界。您可以通过%19s作为转换规范来避免这种情况。您还应该检查scanf()是否成功。

+0

你能解释什么是在这种情况下嵌套sizeof运营商? – Otrebor 2014-09-27 13:30:52

+1

嵌套的sizeof运算符是从我在本书中输入示例中的错字, – 2014-09-27 13:46:37

+1

感谢user2501“写入未分配的内存”的解释是有道理的。 – 2014-09-27 13:48:02

相关问题