0

根据以下答案和所反映的警告/问题更新了代码

我正在尝试在 C 中编写一个指针数组。一个循环设置值,另一个循环检索它们 - 相当简单。这是我尝试设置这些值的方式:

static int  *toInvert[8];
for (i=0; i<8; i++)
{
              int *intrplated = //Function call that returns int*
              toInvert[i] = intrplated;
              //printf("OL Value = %d\n\n\n\n\n",oLoop);
}

为了检索这些值,这里是没有循环的代码,即检索一个固定值:

int *tmpPtr = toInvert[3]; 
printf( "*(TPointer + %d) : %d\n\n", 3, *(toInvert[3] + 1)); //Still gives the recently added value

发生的情况是,当我尝试打印这些值时,只有setter循环中最后添加的值会被打印出来。即使我将 tmpPtr 更改为toInvert[1],它仍然会获得最后设置的值。

但是,如果我在编写的 for 循环中运行相同的代码,它会按预期工作。

我需要知道如何检索所有已设置的值。谢谢

编辑 我想要的是一个包含 8 个指针的 8 个元素的数组。每个指针依次指向一个由 3 个普通整数组成的数组。我想要的数组应该像[p1][p2]...[p8]where[p1]指向一个整数数组。

4

7 回答 7

2

您要实现的是指针数组,对吗?

#include <stdio.h>
#include <stdlib.h>
#define LIMIT 3

int main()
{
    int i,j;
    static int  *toInvert[LIMIT];
    int *intrplated;
    for (i=0; i<LIMIT; i++)
    {
        intrplated = malloc(sizeof(int)*5);
        intrplated[0] = rand();
        intrplated[1] = rand();
        intrplated[2] = rand();
        intrplated[3] = rand();
        intrplated[4] = rand();
        toInvert[i] = intrplated;
    }
    for (i=0;i<LIMIT;i++)
    {
        printf("Tpointer to toInvert[%d] contains::\t [",i);
        for(j=0;j<5;j++)
        {
            printf("%d ",toInvert[i][j]);
        }
        printf("]\n");
    }

    putchar('\n');
    for(j=0;j<5;j++)
    {
        printf("%d ",toInvert[1][j]);
    }
    putchar('\n');
    for(i=0;i<LIMIT;i++)
    {
        free(toInvert[i]);
    }
    return 0;
}

在 GCC 4.8.0 上编译

编辑:查看更改,指针数组保留信息

输出:

Tpointer to toInvert[0] contains::       [41 18467 6334 26500 19169 ]
Tpointer to toInvert[1] contains::       [15724 11478 29358 26962 24464 ] 
Tpointer to toInvert[2] contains::       [5705 28145 23281 16827 9961 ]

15724 11478 29358 26962 24464
于 2013-04-26T18:56:22.413 回答
1

这将起作用。

static int  *toInvert[8];
for (i=0; i<8; i++)
{
          int *intrplated = //Function call that returns int*
          toInvert[i] = intrplated;
          //printf("OL Value = %d\n\n\n\n\n",oLoop);
}

在您的代码中,这

    static int  **toInvert[8];

意味着您有一个指向指针的指针数组。

这个:

          int *intrplated = //Function call that returns int*
          toInvert[i] = intrplated;

是错的。您正在将局部变量的地址传递intrplated给指针数组。

和这个

int *tmpPtr = *toInvert[3];
printf( "*(TPointer + %d) : %d\n\n", 3, *(tmpPtr + 1));

也是错误的,由于 , 的错误声明,它可能适用于您的情况toInvert,但这是错误的。查找有关混合指针和数组声明的更多信息。

于 2013-04-26T18:47:11.257 回答
1

您已在此处声明了一个指向 int 指针的指针数组:

static int  **toInvert[8];

删除 a*以获取指向 int 的指针数组。然后在每次迭代时分配intrplated而不是分配。已经是指针,指向指针的指针也是。全部放在一起:&intrplatedintrplated&intrplated

static int *toInvert[8];
for (i=0; i<8; i++)
{
    int *intrplated = //Function call that returns int*
    toInvert[i] = intrplated;
}
于 2013-04-26T18:45:24.487 回答
1

*你的 s太多了。

#include <stdlib.h>
#include <stdio.h>
int main() {

    static int  *toInvert[8];
    int i;
    for (i=0; i<8; i++)
    {
              int *intrplated = (int*) calloc(10, sizeof(int));
              toInvert[i] = intrplated;
              //printf("OL Value = %d\n\n\n\n\n",oLoop);
    }

    int *tmpPtr = toInvert[3];
    printf( "*(TPointer + %d) : %d\n\n", 3, *(tmpPtr + 1));

    return 0;
}

这是一个整数数组:

int x[8];

这是一个指向int的指针数组:

int *x[8];
于 2013-04-26T18:48:51.563 回答
-1

您的函数调用可能会覆盖它返回的指针。它应该使用 malloc 分配这个指针,你应该在使用它之后释放它。

如果函数返回一个指针,你也应该省略 &。

于 2013-04-26T18:42:06.913 回答
-1

这段代码:

for (i=0; i<8; i++)
{
    toInvert[i] = &intrplated;
}

正在将 的每个元素设置toInvert为 的地址intrplated。无论toInvert您查看哪个元素,您都会取消引用相同的地址并查看存储在intrplated.

此外,一旦for循环退出,intrplated将不再存在,因此在对数组中的值进行引用时,您将获得未定义的行为。

如果您想存储函数返回的指针,这就是您所需要的。

for (i=0; i<8; i++)
{
    toInvert[i] = intrplated;
}

如果要存储,则int *需要一个数组,int *例如:

int * toInvert[8];
于 2013-04-26T18:39:47.550 回答
-1

您不需要 & in:

toInvert[i] = &intrplated;

正确的方法是:

toInvert[i] = &intrplated;

由于 intrplate 已经是一个指向整数的指针,因此您获取的是指针的地址而不是指针本身(本质上是指向指针的指针)。

请记住,指针更像是编译器将其视为内存位置的整数,因此它们本身也存储在某个地方并且也有自己的地址。

还有这个:

static int  **toInvert[8];

不是指针的指针,而是指向指针数组的指针。我相信你真正想要的是:

static int  *toInvert[8];
于 2013-04-26T18:47:08.433 回答