无法将项目添加到 C 中的结构数组
Cant Add Item to Array of Structs in C
我无法将项目添加到结构数组并且无法弄清楚原因。这是它的样子:结构:
typedef struct node
{
char *data;
int count;
};
数组初始化:
struct node* list = malloc(100 * sizeof(struct node));
添加部分:(从文件中读取缓冲区)
fscanf( fp, "%s", &buffer);
list[ index].data = (char*)malloc(strlen( buffer));
strcpy( list[ index].data, buffer);
list[ index].count = 0;
index++;
您的代码存在三个问题
不安全,这样使用fscanf()
很危险。您需要告诉 fscanf()
在一定数量的字符后停止读取以避免缓冲区溢出,例如
char buffer[100];
if (fscanf(fp, "%99s", buffer) != 1)
doNot_Try_to_copy_buffer_itWasNotInitialized();
您将 buffer
的地址传递给 fscanf()
这是错误的,为什么?取决于你如何声明buffer
,如果你声明它像
char buffer;
这是错误的,因为你将只有一个字符 space 并且几乎可以肯定你的程序将调用未定义的行为,如果你将它声明为
char buffer[SOME_REASONABLE_SIZE];
那么问题是sizeof(buffer[0]) != sizeof(&buffer[0])
,因此指针运算将是fscanf()
中的一个问题。
这是错误的,您为 data
字段分配了错误的金额。一个 c 字符串由一个非 nul
字节序列和一个 nul
字节组成,你正在为非 nul
部分分配 space 只是因为 strlen()
returns 非-null
字符的数量,strcpy()
将复制 '[=28=]'
因此您的程序将调用未定义的行为,复制字符串的正确方法是
size_t length = strlen(buffer);
list[index].data = malloc(1 + length);
if (list[index].data != NULL)
memcpy(list[index].data, buffer, 1 + length);
请注意,我使用了 memcpy()
,因为 length
已经用 strlen()
计算过,所以我不想 strcpy()
搜索 '[=28= ]'
再次.
您的代码不安全,因为您忽略了所用函数的 return 值,这会导致未定义的行为。
注意:正如评论中提到的,在 c 中强制转换 void *
是不鼓励和不必要的,并且大多数 c 程序员不理解link posted by @SouravGhosh.
我无法将项目添加到结构数组并且无法弄清楚原因。这是它的样子:结构:
typedef struct node
{
char *data;
int count;
};
数组初始化:
struct node* list = malloc(100 * sizeof(struct node));
添加部分:(从文件中读取缓冲区)
fscanf( fp, "%s", &buffer);
list[ index].data = (char*)malloc(strlen( buffer));
strcpy( list[ index].data, buffer);
list[ index].count = 0;
index++;
您的代码存在三个问题
不安全,这样使用
fscanf()
很危险。您需要告诉fscanf()
在一定数量的字符后停止读取以避免缓冲区溢出,例如char buffer[100]; if (fscanf(fp, "%99s", buffer) != 1) doNot_Try_to_copy_buffer_itWasNotInitialized();
您将
buffer
的地址传递给fscanf()
这是错误的,为什么?取决于你如何声明buffer
,如果你声明它像char buffer;
这是错误的,因为你将只有一个字符 space 并且几乎可以肯定你的程序将调用未定义的行为,如果你将它声明为
char buffer[SOME_REASONABLE_SIZE];
那么问题是
sizeof(buffer[0]) != sizeof(&buffer[0])
,因此指针运算将是fscanf()
中的一个问题。这是错误的,您为
data
字段分配了错误的金额。一个 c 字符串由一个非nul
字节序列和一个nul
字节组成,你正在为非nul
部分分配 space 只是因为strlen()
returns 非-null
字符的数量,strcpy()
将复制'[=28=]'
因此您的程序将调用未定义的行为,复制字符串的正确方法是size_t length = strlen(buffer); list[index].data = malloc(1 + length); if (list[index].data != NULL) memcpy(list[index].data, buffer, 1 + length);
请注意,我使用了
memcpy()
,因为length
已经用strlen()
计算过,所以我不想strcpy()
搜索'[=28= ]'
再次.
您的代码不安全,因为您忽略了所用函数的 return 值,这会导致未定义的行为。
注意:正如评论中提到的,在 c 中强制转换 void *
是不鼓励和不必要的,并且大多数 c 程序员不理解link posted by @SouravGhosh.