gpt4 book ai didi

c - 第一次插入后数组将填充不确定的值

转载 作者:行者123 更新时间:2023-11-30 16:38:10 27 4
gpt4 key购买 nike

我试图将字符串保存到数组中,然后打印它们,但是在保存第一个记录后,整个数组(根据 Visual Studio 调试器)充满了废话。我做错了什么?

int saveRecord(int ixA, int ixB, int length, int* ocupied, char**arr)
{
char r[50];
sprintf(r,"%d: %d - %d", length, ixA, ixB);
arr[*ocupied] = r;
(*ocupied)++;
return 0;
}
int printRecords(int ocupied, char** arr)
{
for (int i = 0; i < ocupied; i++)
{
printf("%s\n", arr[i]);
}
printf("Options: %d\n", ocupied);
return 0;
}
int main()
{
int length = 0, ixA = 0, ixB = 0;
int* ocupied;
int a = 0;
ocupied = &a;
char r[50] = "";
char *arr[250000];
for (int i = 0; i < 250000; i++)
{
arr[i] = "";
}
for (int i = 0; i < 10; i++)
{
scanf("%d %d %d", &ixA, &ixB, &length);
saveRecord(ixA, ixB, length, ocupied, arr);
}
printRecords(*ocupied, arr);
}

最佳答案

问题出在saveRecord中:

char r[50];
sprintf(r,"%d: %d - %d", length, ixA, ixB);
arr[*ocupied] = r;

您将数组中的一个值设置为 r,这是一个本地数组。在此上下文中,arr[*ocupied] 包含指向 r 第一个元素的指针。当 saveRecord 返回时,r 超出范围,因此您保存的指针现在指向无效内存。返回指向局部变量的指针并随后取消引用它会调用 undefined behavior .

由于您希望这些数据在函数外部保留,因此您需要动态分配内存而不是使用局部变量:

// find out exactly how much space is needed
int len = snprintf(NULL, 0, "%d: %d - %d", length, ixA, ixB);
arr[*ocupied] = malloc(len + 1);
snprintf(arr[*ocupied], len + 1, "%d: %d - %d", length, ixA, ixB);

关于c - 第一次插入后数组将填充不确定的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47597843/

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