C函数与数组指针

问题描述 投票:-1回答:1

我正在尝试编写一个函数,当给定一个数组和一个值时,它会检查该值是否在该数组中。如果它在那里,那么在将它添加到数组之前继续寻找新的唯一随机值。这是我到目前为止所做的,但我认为问题是我缺乏对指针的理解。这是我到目前为止:

#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;
}

任何帮助,将不胜感激。

c pointers function-pointers
1个回答
1
投票

可以,然后呢。我打算用一个比喻来解释。希望它有助于而不是混淆更多。

想象一下,内存是一个可以写数字的长板。写一个小数字需要一英寸的电路板。可以通过在更多插槽中书写来表示更大的数字。

在我们的比喻中,数组只是一个连续长度的板,你可以写东西。如果你想要一个5个整数的数组,每个整数需要4英寸,你需要20英寸的板。如果你想将所有这些整数传递给一个函数,而不是将它们全部复制,你可以写下你的数组所在板端的距离。这就是指针。这是一个告诉某事情的数字。

当你打电话给malloc( 2 * sizeof( int ) )时,你要求一块足够大的板子用于两个整数,并且你收到了距离新板块末端多少英寸。所以我们距离末端有8英寸的X英寸,X是我们的指针。

递增指针说“增加此值以指向底层数组的下一个元素”。 int*将增加4,结构大小指向结构的指针加上编译器为其决定的任何对齐偏移。

它不会增加存储量。

如果我有一个指向两个8英寸电路板的指针,写一个4英寸的数字,将指针增加到4英寸以上,写入另一个4英寸的数字并再次递增,我的指针现在正好在数组的最后一个元素之后。如果我在这里写,所有的赌注都是关闭的。阵列后板上有什么?谁知道。它可能是任何东西。也许这是一个不同的阵列。也许这是用于跟踪董事会的哪些部分已经分发给该计划的信息。也许这是我董事会的结束,我会写完最后的。在没有得到操作系统许可的情况下写入存储器是“段违规”,SIGSEGV,程序故障的信号来源。

您需要预先请求更多空间,或者根据需要请求更大的阵列。还有一个realloc也会这样做。对于所有这些,您必须检查呼叫是否失败并终止或以其他方式适当恢复。

希望这比混淆更有帮助。祝好运 :)

© www.soinside.com 2019 - 2024. All rights reserved.