结构中数组的动态内存分配

时间:2013-12-08 03:12:02

标签: c arrays dynamic struct

在c。工作我试图动态分配一个结构中的数组。该数组将保存char数据行。我看不到任何错误,感谢任何帮助。

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct data
{
    char **d;
}Data;

int main(void) 
{
    Data *a = malloc(10*sizeof(Data));
    int i = 0, length = 0;

    for(i = 0; i < 10; i++)
    {
        char buffer[1000] = { '\0' };
        printf("\nenter data\n");
        fgets(buffer, 1000, stdin);

        length = strlen(buffer);
        a[i].d[i] = malloc(sizeof(length+1));  //errors here, unhandled exception
        strcpy(a[i].d[i], buffer);
    }

    for (i = 0; i < 10; i++)
    {
        printf("%s", a[i].d[i]);
    }

    return 0;
}

3 个答案:

答案 0 :(得分:1)

因为char **d是指向指针的指针。 malloc返回void*类型!

因此,

  1. 类型不匹配就在那里。

  2. 您必须先分配指针数组。那是a[i].d=malloc(row*sizeof(char *);

    然后你可以a[i].d[i] = malloc((length+1)*sizoef(char));

答案 1 :(得分:0)

a[i].d[i]

此处i的双重用途是一个红旗。这应该是a[i].da.d[i]。看起来你打算存储10个字符串,每个Data对象一个。在这种情况下,您的结构声明应包含char *而不是char **

typedef struct data {
    char *d;
} Data;

然后分配给d的行将变为:

a[i].d = malloc(length + 1);
strcpy(a[i].d, buffer);

摆脱了双[i]指数。每个Data对象包含一个名为d的字符串。在循环中,为该字符串分配内存,然后将buffer复制到d。一切都好!

另请注意,我已经摆脱了malloc()调用中的sizeof。您想要分配length + 1个字符。无需sizeof。如果您想更明确,可以将length + 1更改为(length + 1) * sizeof(char) - 但您不必这样做,因为sizeof(char)始终为1。

答案 2 :(得分:0)

首先,

malloc(sizeof(length+1));  

毫无意义。你的意思是

malloc(length+1);

mallocchar为单位进行分配。 sizeof()运算符返回作为其参数的类型或对象的char s中的大小。 length+1不是一个合适的论点。

接下来,您似乎意味着要读取一个字符串数组。该结构对问题解决方案的贡献不大。考虑抛出结构并仅使用指向字符的指针数组(即不同长度的字符串数组),或者保留结构并将字段更改为char*类型。

此外,如果您事先不知道文件中的字符串数,则必须使用realloc()之类的内容动态增长数组。

这是字符串数组的方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1000

int main(void) 
{
  int i, n, n_max = 8;
  char **a = malloc(n_max * sizeof(char*));

  for(n = 0; ; ++n)
  {
    char buffer[BUF_SIZE + 1];  // zeroing buffer is a waste with fgets

    printf("\nenter data or Ctrl-Z to stop\n");
    if (!fgets(buffer, sizeof(buffer), stdin)) return;

    if (n >= n_max) {
      n_max *= 2;
      a = realloc(a, n_max * sizeof(char*));
    }
    a[n] = malloc(strlen(buffer) + 1);
    strcpy(a[n], buffer);
  }
  // n now contains number of strings actually read

  for (i = 0; i < n; i++)
  {
    printf("%s", a[i]);
  }

  return 0;
}