具有灵活char数组成员的c-structs



我正在研究灵活的数组成员。我根据我正在学习的书中的一个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()是否成功。

相关内容

  • 没有找到相关文章

最新更新