gpt4 book ai didi

关于指针的C代码

转载 作者:太空宇宙 更新时间:2023-11-04 10:16:27 26 4
gpt4 key购买 nike

我有这个简单的代码,它使用从 Jon Eriksen 的书中获取的指针,我正在尝试编译它,但是当我运行它时 gcc 在编译和段错误(核心转储)中给我警告。

#include<stdio.h>

int main(){
int i;
int int_array[5] = {1, 2, 3, 4, 5};
char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
unsigned int hacky_nonpointer;

hacky_nonpointer = (unsigned int) int_array;

for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int); // hacky_nonpointer = (unsigned int) ((int *) hacky_nonpointer + 1);
}

printf("\n\n\n");

hacky_nonpointer = (unsigned int) char_array;

for(i=0; i < 5; i++){
printf("[hacky non_pointer] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(char); // hacky_nonpointer = (unsigned int *) ((char *) hacky_nonpointer + 1);

}
}

输出:

command line: "gcc -g -o pointer_types5  pointer_types5.c"

pointer_types5.c: In function ‘main’:

pointer_types5.c:16:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
hacky_nonpointer = (unsigned int) int_array;

pointer_types5.c:20:103: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));

pointer_types5.c:20:47: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("[hacky_nonpointer] points to %p which contains the integer %d\n", hacky_nonpointer, *((int *) hacky_nonpointer));

pointer_types5.c:29:24: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
hacky_nonpointer = (unsigned int) char_array;

pointer_types5.c:35:101: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
er] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));

pointer_types5.c:35:48: warning: format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘unsigned int’ [-Wformat=]
printf("[hacky non_pointer] points to %p which contains the char %c\n", hacky_nonpointer, *((char *) hacky_nonpointer));



command line: "./pointer_types5"
Segmentation fault (core dumped)

some more info about my os:
uname -a : Linux PINGUIN 4.10.0-33-generic #37-Ubuntu SMP Fri Aug 11 10:55:28 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

最佳答案

这个程序是错误的,书中给出的建议显然也是错误的。指针可以转换为整数类型,但结果是实现定义的pointer-to-void 可以转换为 intprt_t/uintptr_t如果它们存在,并且然后再次返回指向空的指针 并且您将取回原始指针。这是标准给出的唯一保证。其他东西可能在一个或另一个平台上工作,但它们根本不可移植 - 没有理由在大型程序中使用它们。

%p 需要一个指向 void 的指针作为参数。传递 int 具有未定义的行为。

在程序中尝试的东西根本无法用 C 语言可移植地表达,但可能更正确的程序是

#include <stdio.h>
#include <inttypes.h>

int main(void) {
int i;
int int_array[5] = {1, 2, 3, 4, 5};
char char_array[5] = {'a', 'b', 'c', 'd', 'e'};
uintptr_t hacky_nonpointer;

hacky_nonpointer = (uintptr_t)(void *)int_array;

for(i=0; i < 5; i++){
printf("[hacky_nonpointer] points to %p which contains the integer %d\n", (void *)hacky_nonpointer, *((int *)(void *)hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(int);
}

printf("\n\n\n");

hacky_nonpointer = (uintptr_t)(void *)char_array;

for(i=0; i < 5; i++){
printf("[hacky non_pointer] points to %p which contains the char %c\n", (void *)hacky_nonpointer, *((char *)(void *)hacky_nonpointer));
hacky_nonpointer = hacky_nonpointer + sizeof(char); // hacky_nonpointer = (unsigned int *) ((char *) hacky_nonpointer + 1);

}
}

然而,没有什么可以保证 hacky_nonpointer = hacky_nonpointer + sizeof(int); 在每个平台上都像作者预期的那样运行。然而,它可以在许多普通系统上运行,即 Raspberry Pi、普通 ARM 架构、现代 x86-32 和 x86-64 等等。


这本书不教你 C,它教作者对他认为 C 应该是什么的错误解释。

关于关于指针的C代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46013160/

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