gpt4 book ai didi

c - array[1] 不起作用,而 array+1 起作用

转载 作者:行者123 更新时间:2023-11-30 20:34:26 24 4
gpt4 key购买 nike

据我所知, array[1] 和 array+1 实际上是编写同一事物的两种方式。不过,我最近一直在研究 void 指针和数组,并编写了这个程序来测试我对它的理解。

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

int main(void){
void** data;
data = malloc(sizeof(int)*2);
*((int*)data) = 5;
*((int*)(data+1)) = 10;
printf("%d\n", *((int*)data));
printf("%d\n", *((int*)(data+1)));
free(data);
return 0;
}

这是可以运行的程序版本,但由于某种原因,这个版本不能运行

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

int main(void){
void** data;
data = malloc(sizeof(int)*2);
*((int*)data[0]) = 5;
*((int*)data[1]) = 10;
printf("%d\n", *((int*)data));
printf("%d\n", *((int*)data1]));
free(data);
return 0;
}

我并没有完全得到编译器错误,但程序只是停止运行,我已经在 win 10 机器上使用 gcc 编译了它,并带有以下标志 -pedantic-errors -Wall 就像我说的之前,程序可以编译,但运行时我收到经典的 Program.exe has stop working 错误消息,到目前为止,我真的想不出其中一个可以工作而另一个不能工作的单一原因't。

最佳答案

data+1 不是有效的 C。您不能对 void 指针进行指针算术,因为这没有任何意义。

因此,您似乎在非标准废话模式(默认设置)下使用 gcc,它将 void 指针算术转换为字符算术,因此程序可以编译,但作为非标准 C。 data+1 则意味着 +1 个字节,而不是 +1 int

使用 gcc 作为标准 C 编译器,而不是 -std=c11 -pedantic-errors。然后将代码更改为 (int*)data+1

此外,void** 没有任何意义,应该是 void*。请注意,(int*)data[0] 的意思是“对 void** 类型进行指针算术,然后将结果转换为 int*。这是一个运算符优先级错误。[] 的优先级高于强制转换 () 运算符。

只需扔掉整个代码并使用它:

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

int main(void){
void* data;
data = malloc( sizeof(int[2]) );
((int*)data)[0] = 5;
((int*)data)[1] = 10;
printf("%d\n", *(int*)data );
printf("%d\n", *((int*)data+1) );
free(data);
return 0;
}

关于c - array[1] 不起作用,而 array+1 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42480140/

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