gpt4 book ai didi

char buf[]/pointer 问题与数组的起始地址发生变化

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

首先是我的环境:GCC 4.9.2,Debian Linux 3.16 x86_64。我正在处理其他人的代码,所以我会边做边改(我希望我正在修复问题......)。我遇到了一个 SIGSEGV,但 gdb 似乎失去了理智,跟踪没有指向我程序中的堆栈 (hmm)。所以我求助于 printf。长话短说(为时已晚),我想我已经将其追溯到:

在我的 main() 例程中,我有以下代码:

char buffer[256] = { [0 ... 255] = 0x00 }; // Neat, not seen this before

这个缓冲区被用在不同的地方,代码限制了典型读取 100 字节或更少字节的读取。但是我注意到,当代码运行时,缓冲区的地址发生了变化(仍然在 main() 中):

i = 0x82; // char i;
fprintf(stderr, "C &buffer = %p\n", buffer);
BP_WriteToPirate(fd, &i);
fprintf(stderr, "D &buffer = %p\n", buffer);

编译后:

gcc -g3 -Wall -Os -DTRUE=1 -DFALSE=0 -DVERSION=\"V0.15\"   -c -o main.o main.c
gcc -g3 -o spisniffer serial.o buspirate.o main.o cleanup.o

然后运行我看到了这个输出:

    C &buffer = 0x7fffffffe290
W> 0x82 size = 1 (1)
D &buffer = 0x7fffffffe200

中间的代码是:

uint32_t BP_WriteToPirate(int fd, char *val) {
int res = -1;
char ret = 0;

write(fd, val, 1);

if (disable_comport != 1) { //if comport is enable, we need a response from the port
res = serial_read(fd, &ret, 1);

if( ret != 0x01) {
if (modem==TRUE){
printf("Modem responded with %i byte and with a value of 0X%X\n",res,ret);
} else {
printf("ERROR\n");
return -1;
}
}
}

return 0;
}

如果我用 char *buffer = malloc(sizeof(char)*256) 替换 char buffer[256] 声明,问题似乎不会再次发生。

所以我是在看一个愚蠢的错误还是在系统调用/库中有错误?关于调试技巧的任何指示?

最佳答案

使用 Valgrind 工具查找程序中的无效读/写

关于char buf[]/pointer 问题与数组的起始地址发生变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34483967/

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