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

时间:2017-12-01 16:49:51

标签: c arrays

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

1 个答案:

答案 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);