随机生成数字和排序的种子阵列

时间:2013-02-24 03:45:20

标签: c

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

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

1 个答案:

答案 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返回的确切指针,你永远不应该丢弃/更改该指针的值。