具有灵活char数组成员的结构

时间:2014-09-27 13:24:14

标签: c arrays struct malloc

我正在研究灵活的阵列成员。我根据我正在研究的书中的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;
}

1 个答案:

答案 0 :(得分:2)

是的,你需要分配足够的内存来存储你的字符串。所以你的案子应该是

strlen(input_str)+1.

您正在做的是写入未分配的内存并调用未定义的行为。代码可能有效,但这是错误的。

你的malloc电话中也有拼写错误(?)。它应该是

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

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