除了第0个元素之外,无法读取指针数组的元素

时间:2015-04-03 18:13:28

标签: c arrays

我有一个数组,并希望将它传递给一个函数,该函数需要将指针数组作为参数,当我使用引用传递它时它只给出了该数组的第一个元素。我究竟做错了什么?这是我的代码:

#include <stdio.h>
#include <stdlib.h>

struct abc{
    int a;
};

void a(struct abc* j[]){
    printf("%d\n",j[1]->a);
}

int main()
{
    struct abc* k = malloc(2 * sizeof(struct abc));
    k[0].a = 2;
    k[1].a = 3;
    a(&k);
    return 0;
}

提前致谢

3 个答案:

答案 0 :(得分:3)

编辑:您当前没有创建指针数组。您当前正在创建一个结构数组。要创建指针数组,请执行以下操作:

#include <stdio.h>
#include <stdlib.h>

struct abc{
    int a;
};

void a(struct abc* j[]){
    printf("%d\n",j[1]->a);
}

int main()
{
    struct abc **k = malloc(2 * sizeof(struct abc *));

    k[0] = malloc(sizeof(struct abc));
    k[1] = malloc(sizeof(struct abc));
    k[0]->a = 2;
    k[1]->a = 3;
    a(k);
    return 0;
}

旧:如果你想只使用一组结构:

#include <stdio.h>
#include <stdlib.h>

struct abc{
    int a;
};

void a(struct abc* j){
    printf("%d\n",j[1].a);
}

int main()
{
    struct abc* k = malloc(2 * sizeof(struct abc));
    k[0].a = 2;
    k[1].a = 3;
    a(k);
    return 0;
}

答案 1 :(得分:1)

如果要传递数组。将指针传递给第一个元素和元素个数。

#include <stdio.h>
#include <stdlib.h>

struct abc{
    int a;
};

void a(struct abc* j, int num){
    int i;
    for(i = 0; i < num; i++)
    {
       printf("element %d has a value %d\n", i, j[i].a);
    }
}

int main()
{
    struct abc* k = malloc(2 * sizeof(struct abc));
    k[0].a = 2;
    k[1].a = 3;
    a(k, 2);
    free(k);
    return 0;
}

如果指针数组是你之后的

那么
#include <stdio.h>
#include <stdlib.h>

struct abc{
    int a;
};

void a(struct abc** j){
    struct abc** tmp = j;

    while(*tmp != NULL)
    {
       printf("value is %d\n", (*tmp)->a);
       tmp++;
    }
}

int main()
{
    struct abc** k = malloc(3 * sizeof(struct abc*));
    k[0] = malloc(sizeof(struct abc));
    k[0]->a = 3;
    k[1] = malloc(sizeof(struct abc));
    k[1]->a = 2;
    k[2] = NULL;
    a(k);

    free(k[0]);
    free(k[1]);
    free(k);
    return 0;
}

答案 2 :(得分:0)

printf("%d\n",j[1]->a);应为printf("%d\n",(*j)[1].a);

(*j)[1].a)表示k[1].a。 (j = &k(*j)[1].a) ==&gt; (*&k)[1].a ==&gt; (k)[1].a

注意:*j[1]表示*(j[1])。因此*j必须括在括号中(例如(*j))。

struct abc* j[]表示指向struct abc的指针数组。

函数调用的情况为a(&k);
j相当于只有一个k的数组。 (如struct abc* j[] = { k };
所以j[1]是指针无效的事实。

j[0]表示k因此以下内容有效。

printf("%d\n", j[0]->a);//2
printf("%d\n", (j[0]+1)->a);//3