在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;
}
答案 0 :(得分:1)
因为char **d
是指向指针的指针。 malloc返回void*
类型!
因此,
类型不匹配就在那里。
您必须先分配指针数组。那是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].d
或a.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);
malloc
以char
为单位进行分配。 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;
}