设置指针数组

Setting array of pointers

我正在做一个小练习,将指针数组(双指针)加载到结构。我在头文件中有如下定义:

#include <stdio.h>

#define LEN (5)

typedef struct sample_s {
    int num;
    char *name;
}sample_t;

typedef struct new_sample_s {
    char *string;
    sample_t **sample_arr;
}new_sample_t;

sample_t table[LEN] = {
    {0, "eel"},
    {1, "salmon"}, 
    {2, "cod"},
    {3, "tuna"},
    {4, "catfish"}
};

并使用此 .c 文件中的定义:

#include "test.h"

void print_new_sample_array(sample_t **sample_arr) {
    int len = sizeof(table)/sizeof(new_sample_t);
    for(int i = 0; i < len; i++){
        printf("The array element is: %s\n", sample_arr[i]->name);
    }
}

int main() {

    new_sample_t new_sample;
    new_sample.sample_arr = table;

    print_new_sample_array(new_sample.sample_arr);

    return 0;
}

我有两个问题:

首先,我不确定如何将 table 正确加载到 new_sample.sample_arr 此处的错误消息:

test.c: In function ‘main’:
test.c:13:27: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
     new_sample.sample_arr = table;
                           ^

其次,我不确定如何引用 sample_arr 中每个元素的属性。例如,当我执行以下操作时,程序出错:

for(int i = 0; i < LEN; i++){
    printf("This is the elem in the array: %s", new_sample[i]->name);
}

我想了解更多关于双指针的概念以及我做错的原因。我真的很感激答案将 sample_arr 保持为双指针

谢谢!

在这个赋值语句中

new_sample.sample_arr = table;

右操作数(在数组隐式转换为指向其第一个元素的指针之后)具有类型 sample_t *,而左操作数由于数据成员的声明而具有类型 sample_t **

sample_t **sample_arr;

没有从类型 sample_t * 到类型 sample_t ** 的隐式转换。所以编译器发出了一条消息。

你应该像这样声明数据成员

sample_t *sample_arr;

相应的函数声明看起来像

void print_new_sample_array(sample_t *sample_arr);

在函数中 printf 的调用看起来像

printf("The array element is: %s\n", sample_arr[i].name);