gpt4 book ai didi

c - 如何使用函数推进数组基地址?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:46:58 26 4
gpt4 key购买 nike

我正在尝试编写一个函数,以指定的字节大小转发指针。

void
increment_ptr(void **_ptr, int size){
*_ptr = (char *)(*_ptr) + size;
}

int
main(int argc, char **argv){
int arr[] = {11,20};
printf("%d\n", arr[0]);
increment_ptr((void **)&arr, sizeof(int));
printf("%d\n", arr[0]);
return 0;
}

我得到的输出是:

vm@vm:~$ ./a.out
11
15

我期望输出为 11 和 20。

有人可以帮忙吗?

最佳答案

arr 不是您可以更改的普通变量。它不是指针 - 它的类型是 int[2]

试试这段代码:

#include <stdio.h>
void
increment_ptr(void **_ptr, int size){
*_ptr = (char *)(*_ptr) + size;
}

int
main(int argc, char **argv){
int arr[] = {11,20};
int* arr1 = arr;

printf("arr is %p\n", (void*)arr);
printf("arr1 is %p\n", (void*)arr1);
printf("arr gives %d\n", arr[0]);
printf("arr1 gives %d\n", arr1[0]);

increment_ptr((void **)&arr, sizeof(int));
increment_ptr((void **)&arr1, sizeof(int));

printf("arr is %p\n", (void*)arr);
printf("arr1 is %p\n", (void*)arr1);
printf("arr gives %d\n", arr[0]);
printf("arr1 gives %d\n", arr1[0]);

return 0;
}

可能的输出:

arr  is 0xfff1d1b8
arr1 is 0xfff1d1b8
arr gives 11
arr1 gives 11
arr is 0xfff1d1b8 // Notice arr isn't changed
arr1 is 0xfff1d1bc // arr1 works as expected
arr gives 15
arr1 gives 20

换句话说:你不能推进这样一个数组的基址

您可能还会发现这段代码很有趣:

#include <stdio.h>

int main(int argc, char **argv){
int arr[2] = {11,20};
printf("arr is %p\n", (void*)arr);
printf("arr is %p\n", (void*)&arr);
return 0;
}

可能的输出:

arr   is 0061FED8
&arr is 0061FED8

请注意将 arr 作为指针打印与打印 &arr 的结果相同

所以在您的代码中发生的是数字 11(又名 arr[0])被读取为指针(转换为 char*),然后添加 4 (所以你有 15)覆盖了当前的 11。注意:此结果表明指针和 int 在您的系统上都是 4 字节。

关于c - 如何使用函数推进数组基地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39858794/

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