我正在尝试将字符串保存到数组中然后打印它们但是在保存第一条记录之后,整个数组(根据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);
}
答案 0 :(得分:0)
问题出在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);