记录未在C中更新,因为结构指针未更新

时间:2015-10-10 17:32:45

标签: c function pointers struct

这是我的代码:

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

typedef struct{
    char item[1000];
} itemset;

void additem(itemset* items,char* thing,unsigned long* numadded){
    memcpy(items->item,thing,1000);
    items++;(*numadded)++;
}

void showitems(itemset* items,unsigned long numitems){
    itemset* p=items;
    unsigned long count;
    for (count=1;count<=numitems;count++){
        printf("%d %s\n",count,p->item);p++;
    }
}

int main(){
    itemset* myitems=calloc(1,sizeof(itemset)*10);
    itemset* itemstart=myitems;
    unsigned long added=0;
    additem(myitems,"Test",&added);
    additem(myitems,"Test2",&added);
    additem(myitems,"Test3",&added);
    printf("Count=%d\n",added);
    showitems(itemstart,added);
    free(itemstart);
}

我试图在屏幕上看到运行此代码的内容是:

Count=3
1 Test
2 Test2
3 Test3

但相反,我明白了:

Count=3
1 Test3
2
3

因此我的additem功能无法正常工作。我发现修复是在每次函数调用后立即添加myitems++;,但我试图在additem函数内部发生相同的行为,这样我就不必使用myitems++;了功能。我还能做些什么来解决这个问题?

4 个答案:

答案 0 :(得分:1)

使用#include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, const char * argv[]) { FILE *myfile; myfile = fopen("Test.txt", "r"); char *numWords; long n = strtol(argv[1], &numWords, 10); if(argc != 2) { printf("Too Few Arguments"); } else { char arr[n][100]; int i = 0; while(fgets(arr[i],sizeof(arr),myfile)!=NULL) { arr[i][strlen(arr[i])-1] = '\0'; i++; } int total = i; for(i = 0; i < total; ++i) { printf("%s\n", arr[i]); } fclose(myfile); } return 0; } 的双指针,如下所示:

items

输出:

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

typedef struct{
    char item[1000];
} itemset;

void additem(itemset** items,char* thing,unsigned long* numadded){
    memcpy((**items)->item,thing,1000);
    (*items)++;
    (*numadded)++;
}

void showitems(itemset* items,unsigned long numitems){
    itemset* p=items;
    unsigned long count;
    for (count=1;count<=numitems;count++){
        printf("%d %s\n",count,p->item);
        p++;
    }
}

int main(void){
    itemset* myitems=calloc(1,sizeof(itemset)*10);
    itemset* itemstart=myitems;
    unsigned long added=0;
    additem(&myitems,"Test",&added);
    additem(&myitems,"Test2",&added);
    additem(&myitems,"Test3",&added);
    printf("Count=%d\n",added);
    showitems(itemstart,added);
    free(itemstart);
    return 0;
}

另外,请检查:How to print an unsigned long int with printf in C?,表示您应该使用Count=3 1 Test 2 Test2 3 Test3 ,而不是%lu

答案 1 :(得分:0)

我只是设法为我找到了一个有效的答案,那个刚刚回答的人也提出了类似的答案。

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

typedef struct{
    char item[1000];
} itemset;

void additem(itemset** items,char* thing,unsigned long* numadded){
    memcpy((**items).item,thing,1000);
    (*items)++;(*numadded)++;
}

void showitems(itemset* items,unsigned long numitems){
    itemset* p=items;
    unsigned long count;
    for (count=1;count<=numitems;count++){
        printf("%d %s\n",count,p->item);p++;
    }
}

int main(){
    itemset* myitems=calloc(1,sizeof(itemset)*10);
    itemset* itemstart=myitems;
    unsigned long added=0;
    additem(&myitems,"Test",&added);
    additem(&myitems,"Test2",&added);
    additem(&myitems,"Test3",&added);
    printf("Count=%d\n",added);
    showitems(itemstart,added);
    free(itemstart);
}

答案 2 :(得分:0)

你在添加项目功能中过度编写相同的指针。您需要将指针传递给指针才能使其工作。也可以使用strcpy进行字符串复制。并且对于showitems传递在calloc调用中分配的指针,因为它没有cahnge

答案 3 :(得分:-1)

您需要将items传递给&#34;参考&#34;同样,不仅numadded。或者可能会返回新指针。