我正在尝试编写一个函数,当给定一个数组和一个值时,它将检查该值是否在该数组中。如果存在,则继续寻找新的唯一随机值,然后再将其添加到数组中。到目前为止,这是我所做的,但是我认为问题是我对指针缺乏理解。这是我到目前为止的内容:
#include <stdio.h>
#include <stdlib.h>
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex);
int main() {
int *visitedPixels = malloc(2 * sizeof(int));
int *visitedPixelsIndex = 0;
srand(1);
int randIndex = rand() % 16, i;
printf("Initial randIndex = %d\n", randIndex);
for(i = 0; i < 16; i++) {
randIndex = getNewIndex(randIndex, visitedPixels, visitedPixelsIndex);
printf("randIndex[%d] = %d\n", i, visitedPixels[i]);
}
return 0;
}
int getNewIndex(int index, int *visitedPixels, int *visitedPixelsIndex) {
int i = 0;
while (i < *visitedPixelsIndex) {
(index == visitedPixels[i]) ? index = rand() % 16, i = 0 : i++;
}
visitedPixels[*visitedPixelsIndex] = index;
(*visitedPixelsIndex)++;
//(*visitedPixels) = realloc(visitedPixels, (*visitedPixelsIndex+1) * sizeof(int));
return index;
}
任何帮助将不胜感激。
答案 0 :(得分:1)
好的。我将尝试用隐喻来解释。希望它能帮助而不是造成更多混乱。
想象一下,记忆是一块长板,可以在上面写数字。编写少量数字需要一英寸的板。可以通过在更多插槽中写入来表示更大的数字。
在我们的隐喻中,数组只是您可以将内容写入其中的一块连续的木板。如果您想要一个由5个整数组成的数组,并且每个整数占用4英寸,则需要20英寸的木板。如果您想将所有这些整数传递给一个函数,而不是全部复制它们,则应记下距数组末端的距离是多少英寸。那就是指针。这是一个数字,告诉事物在哪里。
当您致电malloc( 2 * sizeof( int ) )
时,您要求一块板子足够大以容纳两个整数,并且您收到了距离板子末端几英寸的新段。因此,我们距离木板X端的距离为8英寸,X为我们的指针。
增加指针表示“增加该值以指向基础数组的下一个元素”。 int*
将增加4,即指向该结构的指针的大小等于该结构的大小加上编译器为此决定的对齐偏移量。
它不会增加存储量。
如果我有一个指向两个8英寸木板的指针,则写一个4英寸的数字,将指针增加一点以指向4英寸,再写入另一个4英寸的数字,然后再次递增,我的指针现在位于的最后一个元素之后数组。如果我在这里写,所有的赌注都关闭了。阵列后板上有什么?谁知道。可能是任何东西。也许是另外一个数组。也许这是用于跟踪董事会的哪些部分已分发给该程序的信息。也许这是我董事会的结尾,我将注销结尾。在未获得操作系统许可的情况下写入内存是“段违规”,SIGSEGV,程序失败的信号的来源。
您需要预先请求更多空间,或者根据需要请求更大的数组。还有一个realloc也可以做到这一点。对于所有这些,您必须检查呼叫是否失败,终止或以其他方式适当恢复。
希望这比混淆更有用。祝你好运:)