gpt4 book ai didi

C中静态和动态数组的混淆

转载 作者:太空狗 更新时间:2023-10-29 15:29:41 24 4
gpt4 key购买 nike

typedef struct mystruct{
int a;
char arr[10];
char *str;
}mystruct;


void f(void *data, int offset){
char *s = (char *)(data + offset);
printf("%s", s);
}

void g(void *data, int offset){
char *s = *(char **)(data+offset);
printf("%s", s);
}

int main(){
mystruct test;
test.a = 2;
test.str = malloc(100);
strcpy(test.arr, "Hello ");
strcpy(test.str, "World!");
f(&test, offsetof(mystruct,arr));
g(&test, offsetof(mystruct,str));
return 0;
}

我想知道为什么我需要两种不同的方式来打印字符串。在函数 f 中,(data + offset) 实际上指向什么?它不是指向 arr 这是一个指向字符串第一个元素的字符指针吗?但是在函数 g 中,(data + offset) 也指向一个 char 指针。那么为什么必须使用两种不同的方法来完成相同的任务呢?

最佳答案

在这两种情况下,data+offset 都指向结构的成员

但是让我们看看结构体的结构。它由

+-----+--------------------------------------------+
| a | sizeof(int) probably 4 or 8 bytes |
+-----+--------------------------------------------+
| possible padding of unknown size (probably zero) |
+-----+--------------------------------------------+
| arr | 10 bytes |
+-----+--------------------------------------------+
| possible padding of unknown size (maybe 2 bytes) |
+-----+--------------------------------------------+
| str | sizeof(char*) probably 4 or 8 bytes |
+-----+--------------------------------------------+

内存中的其他地方是用 malloc 分配的 100 字节 block 。

注意 test.arr 的数据存储在 分配给 test 的内存中,但是存储在 test 中的东西对于test.str是另一 block 内存的地址。

关于C中静态和动态数组的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17070123/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com