我正在尝试通过创建相同大小的数组(由用户的输入确定)并用随机数填充它来练习我的C.我遇到了一些问题。首先,我创建和分配数组:
srandom((int)time(NULL)); /* initialize random seed for later use*/
unsigned long arraySize = strtoul(argv[1], NULL, 0);
int *originalArray = malloc(arraySize * sizeof(int));
int *ascendingOrderArray = malloc(arraySize * sizeof(int));
int *descendingOrderArray = malloc(arraySize * sizeof(int));
接下来,我用随机数填充数组的循环:
int i = 0;
int randInt;
/* Seed each array with identical randomly generated numbers */
while(i++ < arraySize){
randInt = (int)random()%100;
*originalArray++ = randInt;
printf("original array assign: %d\n", originalArray);
*ascendingOrderArray++ = originalArray;
printf("ascending array assign: %d\n", ascendingOrderArray);
*descendingOrderArray++ = originalArray;
printf("descending array assign: %d\n", descendingOrderArray);
}
在这里,事情变得奇怪。我期望每个数组的数量与为每个索引分配给originalArray的数字相同。我从printf
语句得到的输出并没有反映出来。此外,数字是巨大的,但它们都有一个类似的基础,从2开始,并延伸许多数字。这应该发生吗?
最后,当我完成所有操作并进行一些无关紧要的打印和格式化后,我会尝试释放我的数组:
free(originalArray);
originalArray = NULL;
free(ascendingOrderArray);
ascendingOrderArray = NULL;
free(descendingOrderArray);
descendingOrderArray = NULL;
return 0;
但我收到pointer being freed was not allocated
错误。
我确定我在这里搞砸了多个级别,但问题是:在哪里?
答案 0 :(得分:1)
你对所有3个阵列都有同样的基本问题,但让我们看一下。在这里你分配它:
int *originalArray = malloc(arraySize * sizeof(int));
因此变量originalArray
指向已分配内存块。然后开始使用它来分配数组:
*originalArray++ = randInt;
这很糟糕。你刚刚递增originalArray
,现在没有指向内存块开头的指针。你应该做的是
originalArray[i] = randInt;
printf("original array assign: %d\n", originalArray[i]);
这样你就可以使用索引i
来说明数字应该在数组中的哪个位置,originalArray
本身仍然是指向已分配内存块的指针,即你的开头阵列。
由于originalArray
在所有这些中都没有改变,所以当你
free(originalArray);
然后originalArray
仍然是从malloc
返回的值,这是free
想要返回的值。
总结:你应该总是释放malloc返回的确切指针,你永远不应该丢弃/更改该指针的值。