gpt4 book ai didi

C 嵌套传递引用内存错误

转载 作者:太空宇宙 更新时间:2023-11-04 00:58:53 25 4
gpt4 key购买 nike

目标

这就是我想要做的,我想创建一个用户列表并用默认值填充所有信息。然后我想将该列表传递给一个函数,该函数将遍历所有用户并将每个用户解析为一大串数据以返回给用户。

错误

当我遍历结构数组时,没有任何值被正确添加到字符串中。我是 c 的新手,但我知道我没有在引用调用中的某个地方正确处理我的内存。是的,我确实想通过引用传递我所有的值,我正在处理的其他代码需要它,这只是我遇到的问题的简化版本。

代码

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

// A simple struct to hold user data
struct user_data
{

int id;
int age;

};

// Fill the user with blank information
struct user_data get_blank_user()
{

struct user_data temp_user;
temp_user.id = 0;
temp_user.age = 0;
return temp_user;

}

// Turn a structure into a string
void user_struct_to_string(struct user_data *input_user, char **return_data)
{

// Hold the user id and age
char user_id[10];
char user_age[10];

// print the data into the char arrays
sprintf(user_id, "{%d,", input_user->id);
sprintf(user_age, "%d}", input_user->age);

// Clear all data that was inside the string
memset(*return_data, 0, sizeof(return_data));

// copy all the data into the return data
strcat(*return_data, user_id);
strcat(*return_data, user_age);

}

// Turn a array of structures into a large string
void get_all_users_string(struct user_data **input_users, int number_of_users, char **return_data)
{

char *string_holder = malloc(100 * sizeof(char));
int i;

// Loop through all users and add there string of data to the list
for(i = 0; i < number_of_users; i++)
{
// If you are not the first user add a comma before you add to the string
if (i > 0)
strcat(*return_data, ",\0");

// ERROR here after first loop
user_struct_to_string(&input_users[i], &string_holder);

// Add the current users string data to the return data
strcat(*return_data, string_holder);

}

}

int main()
{

int i;
int number_of_users = 10;
char *user_string = malloc(256 * sizeof(char));

// Create a dynamic array of users
struct user_data *users = malloc(number_of_users * sizeof(struct user_data));

// Fill each user with blank data
for(i = 0; i < number_of_users; i++)
users[i] = get_blank_user();

// Print out a test to prove the function works
user_struct_to_string(&users[4], &user_string);
printf("User struct as string: %s\n", user_string);

// Print user data for test
for(i = 0; i < number_of_users; i++)
printf("User id: %d\tUser age: %d\n", users[i].id, users[i].age);

// Parse all users data into one string
get_all_users_string(&users, number_of_users, &user_string);
printf("End string: %s\n", user_string);

return 0;
}

结果

User struct as string: {0,0}
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
User id: 0 User age: 0
End string: {0,0}{26071328,0},{1879764480,-943433287},{925474080,32764},{0,0},{4196752,0},{1587521584,32641},{0,0},{925474088,32764},{0,1},{4196429,0}

一如既往地感谢任何花时间阅读/帮助讨论的人。

最佳答案

这不会像你期望的那样:

memset(*return_data, 0, sizeof(return_data));

sizeof 将评估为指针大小,而不是字符串的大小。您需要将字符串的长度传递给该函数。

您还应该使用strncat 并传递return_data 的长度。

同时将sprintf替换为snprintf,并传递user_id的长度。

关于C 嵌套传递引用内存错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48638132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com