使用C创建列表和结构数组

时间:2015-10-26 16:49:16

标签: c arrays pointers struct

我目前正在使用C开始,所以我想我会尝试创建自己的自定义列表。这是代码:

#include <stdio.h>

struct list {
    char data[10];
    struct list *n;
};

void clist(struct list *a) {
    int j=(sizeof(a)/sizeof(a[0]));
    j--;    
    for(int i=0; i<j-1; i++) {
        struct list *next=&a[i+1];
        a[i].n=next; 
    }
}

int main() {

    struct list first = {.data="one", .n=NULL};
    struct list second = {.data="two", .n=NULL};
    struct list third = {.data="three", .n=NULL};

    struct list arr[] = {first, second, third}; 
    struct list *p=&arr[0];

    clist(p);

    struct list looper = first;

    while(looper.n!=NULL) {
        printf("%s ", looper.data);
        looper = *looper.n;
    }

    return 0;
}

所以基本上我有一个保存char数组和指针的结构。我初始化它们然后我尝试通过将它们提供给clist方法将它们链接在一起。 存在的问题是:当变量j保持为0时,似乎clist没有得到任何有用的东西。如果我在将数组赋予clist方法之前进行整个大小计算,那么我得到正确的3。那是为什么?

2 个答案:

答案 0 :(得分:2)

在C中,数组参数被视为指针。因此,sizeof(a)/sizeof(a[0])表达式变为sizeof(int *)/sizeof(int)

  

所以你基本上得到的是(how big your address is) / (size of integer)

解决方法是将数组a中的元素数作为另一个参数发送给函数。

答案 1 :(得分:0)

您的代码有几处错误。

第一个是内部函数clist表达式

sizeof(a)/sizeof(a[0])

相当于

sizeof( struct list * ) / sizeof( struct list )

并且将等于 0 ,因为使用了整数值,并且指针的大小小于指向的结构对象的大小。

您需要将数组的大小显式传递给函数。但即使变量j确实等于数组的大小,这个代码在函数体中也是无效的

j--;    
for(int i=0; i<j-1; i++) {
    struct list *next=&a[i+1];
    a[i].n=next; 
}

让我们假设数组有两个元素。在这种情况下,j的初始值也将等于2.语句后

j--;    

它将等于1并且在循环内

for(int i=0; i<j-1; i++) {

条件

i<j-1

将被评估为false。因此循环将不会被执行,并且不会构建列表。

此主循环

while(looper.n!=NULL) {
    printf("%s ", looper.data);
    looper = *looper.n;
}

不会显示最后一个元素的数据成员,因为最后一个元素的数据成员n等于NULL。

我建议您对程序进行以下修改

#include <stdio.h>

struct list 
{
    char data[10];
    struct list *next;
};

void clist( struct list *a, size_t n ) 
{
    for( size_t i = 0, j = 1; j < n; ++i, j++ )
    {        
        ( a + i )->next = a + j; 
    }
}

int main( void )
{
    struct list first  = { .data="one",   .next = NULL };
    struct list second = { .data="two",   .next = NULL };
    struct list third  = { .data="three", .next = NULL };

    struct list arr[] = { first, second, third }; 

    clist( arr, sizeof( arr ) / sizeof( *arr ) );

    for ( struct list *first = arr; first != NULL;  first = first->next ) 
    {
        printf( "%s ", first->data);
    }


    return 0;
}

其输出符合预期

one two three