0

我试图通过创建大小相等的数组(由用户的输入确定)并用随机数填充它们来练习我的 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错误。

我确定我在这里搞砸了多个级别,但问题是:在哪里?

4

1 回答 1

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

thenoriginalArray仍然是从 返回的值malloc,这是free想要返回的值。

摘要:您应该始终释放 malloc 返回的确切指针,并且永远不应该丢弃/更改该指针的值。

于 2013-02-24T04:03:40.373 回答