C语言数据结构指针问题

这是我的代码

#include<stdio.h>
typedef struct{
    int length;
    int capacity;
    int *data;
}Seqlist;
Seqlist * Create(int capacity);
void Set(Seqlist * seqlist,int * data);
int main(){
    Seqlist * seqlist = Create(5);
    int data = 999;
    Set(seqlist,&data);
    printf("%d",*(seqlist->data[0]));
    return 0;    
}
Seqlist * Create(int capacity){
    Seqlist * seqlist = NULL;
    seqlist = (Seqlist * )malloc(sizeof(Seqlist));
    memset(seqlist,0,sizeof(Seqlist));    
    seqlist->capacity = capacity;
    seqlist->data = (int *)malloc(sizeof(int));
    printf("Init!\n");
    return seqlist;
}
void Set(Seqlist * seqlist,int * data){
    if(seqlist == NULL || seqlist->data == NULL) return;
    //为了减少阅读量,
    //这里先不做其他健壮性判断了 
    seqlist->data[seqlist->length] = data;
    seqlist->length++;
}

这是出错的错误

img


问题是我创建的是指针数组,那我就可以存入指针,既然是指针就可以指向变量的地址,那这样逻辑就通顺了,我创建指针数组去存指向变量的指针也就可以通过指针数组的下标去*它间接拿到值,但是我的编译却无法通过,请问这是为什么呀,我的逻辑简单点来说就是类似于这样的过程

#include<stdio.h>
 void set(int * a);
int main(){
    int * a[1];
    int b = 1;
    a[0] = &b;
    set(a[0]);
    printf("%d\n",a[0]);
    return 0;
}
void set(int * a){
    printf("%d\t\n",*a[0]);
}

main函数里边,应该用printf("%d", *(seqlist->data))来打印第一个元素的值,data是一个指向整数数组的指针
set函数里边seqlist->data[seqlist->length] = *data,同样,data是指向整数数组的指针

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

typedef struct {
    int length;
    int capacity;
    int *data;
} Seqlist;

Seqlist *Create(int capacity);
void Set(Seqlist *seqlist, int *data);

int main() {
    Seqlist *seqlist = Create(5);
    int data = 999;
    Set(seqlist, &data);
    printf("%d", *(seqlist->data));
    free(seqlist->data);
    free(seqlist);
    return 0;
}

Seqlist *Create(int capacity) {
    Seqlist *seqlist = (Seqlist *)malloc(sizeof(Seqlist));
    memset(seqlist, 0, sizeof(Seqlist));
    seqlist->capacity = capacity;
    seqlist->data = (int *)calloc(capacity, sizeof(int));
    printf("Init!\n");
    return seqlist;
}

void Set(Seqlist *seqlist, int *data) {
    if (seqlist == NULL || seqlist->data == NULL) return;
    seqlist->data[seqlist->length] = *data;
    seqlist->length++;
}


【以下回答由 GPT 生成】

这段代码无法通过编译是因为在Set函数中存在一个类型不匹配的错误,具体是将一个int的指针赋值给了int类型的数组元素。此外,在创建数组时也存在问题,malloc分配的内存大小仅为一个int的大小,而不是根据capacity来确定的。

要解决这个问题,可以按照以下步骤进行修改:

  1. 首先,在Set函数中将int *data的赋值语句修改为:seqlist->data[seqlist->length] = *data;,这样可以将data所指向的值赋给data数组中相应位置的元素。

  2. 其次,在Create函数中,将数组的大小从sizeof(int)修改为sizeof(int) * capacity,这样可以根据capacity动态分配适当大小的内存。

修改后的代码如下所示:

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

typedef struct{
    int length;
    int capacity;
    int *data;
}Seqlist;

Seqlist * Create(int capacity);
void Set(Seqlist * seqlist, int * data);

int main(){
    Seqlist * seqlist = Create(5);
    int data = 999;
    Set(seqlist,&data);
    printf("%d",seqlist->data[0]);
    return 0;    
}

Seqlist * Create(int capacity){
    Seqlist * seqlist = NULL;
    seqlist = (Seqlist * )malloc(sizeof(Seqlist));
    memset(seqlist,0,sizeof(Seqlist));    
    seqlist->capacity = capacity;
    seqlist->data = (int *)malloc(sizeof(int) * capacity);
    printf("Init!\n");
    return seqlist;
}

void Set(Seqlist * seqlist, int * data){
    if(seqlist == NULL || seqlist->data == NULL) return;
    seqlist->data[seqlist->length] = *data;
    seqlist->length++;
}

上述代码修复了类型不匹配的错误,并且为数组分配了合适的内存大小。修改后的代码可以正确编译和运行。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^