我目前正在实现一个链表,它将在每个节点中存储一个字符串数组。目前我正在尝试将这些字符串数组返回给main。结构代码是
#define MAX_LINE 80
typedef struct node
{
char things[MAX_LINE/2][MAX_LINE];
struct node *link;
}Node;
并且问题的方法是
char **getThings(Node *head, int position){
if(position == 1){
return head->things;
}
int i = 1;
while(head->link != NULL){
head = head->link;
i++;
if(i == position){
return head->things;
}
}
{
然而,错误是一个“警告:从不兼容的指针类型返回。我已经查看了在C和动态分配中返回的数组但是无法理解它与链表访问有关。如果每个元素都在事情被取出并放入一个动态分配的数组中,如果是这样的话?
答案 0 :(得分:1)
您应该从getThings
试
#define MAX_LINE 80
typedef char (*thing_t)[MAX_LINE];
thing_t getThings(Node *head, int position){
if(position == 1){
return head->things;
}
int i = 1;
while(head->link != NULL){
head = head->link;
i++;
if(i == position){
return head->things;
}
}
答案 1 :(得分:1)
指针和数组是不同的类型。在某些情况下,数组求值为指向其第一个元素的指针。这并不意味着数组和指针是相同的。它们具有不同的指针算法和不同的sizeof值。
things
中的{p> struct node
类型为array of 80 char[80]
类型char[80]
类型为array of 80 int
类型。函数getThings
返回char **
类型的值,该值与int **
类型不同且不兼容。
从函数返回数组时,实际上会返回指向数组第一个元素的指针。因此head->things
评估为键入pointer to int[MAX_LINE]
。在返回此值之前,您通过隐式类型转换更改其类型,因为它与函数的返回类型不匹配。 (因此警告)。
// in getThings
return head->things
所以基本上它等同于基本上这样做
return (int **)head->things;
我已经详细地写了here为什么int **
和int *[MAX_LINE]
是不兼容的类型,并且将后者类型转换为前一种类型是完全错误的。明确的类型转换无济于事。它只会抑制更糟糕的警告。
使这项工作的唯一方法是将您的功能签名更改为:
typedef char (*arr_ptr)[MAX_LINE];
arr_ptr getThings(Node *head, int position);
答案 2 :(得分:0)
char (*getThings(Node *head, int position))[MAX_LINE]{
...
char (*p)[MAX_LINE];
p=getThings(&head, 1);