据我所知,这个远数组[1]和数组+ 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;
}
我并没有完全得到编译器错误,但程序只是停止运行,我已经使用带有以下标志-pedantic-errors -Wall
的gcc在win 10机器上编译了这个并且像我之前所说的,程序编译但是在运行时我收到了经典的Program.exe has stopped working
错误消息,到目前为止,我真的想不出为什么其中一个会起作用而另一个不起作用的原因。
答案 0 :(得分:2)
data+1
无效C.你不能对void指针进行指针运算,因为那没有任何意义。
所以你似乎在非标准垃圾模式(默认设置)中使用gcc,它将无效指针算法转换为字符算术,因此程序编译,但作为非标准C. data+1
会然后意味着+1字节,而不是+1 int
。
使用gcc作为标准C编译器而不是-std=c11 -pedantic-errors
。然后将代码更改为(int*)data+1
。
void**
也没有意义,应该是void*
。请注意,(int*)data[0]
表示&#34;在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;
}
答案 1 :(得分:0)
您的示例都不正确。
void** data = malloc(sizeof(int)*2);
正在分配2 int
个整数,但如果类型为data
则为void**
。如果您仍希望使用此值(不建议使用此值),则需要分配2 void*
}指针。这将是:
void** data = malloc(sizeof(void*)*2);
话虽如此,此处不需要使用void**
。您可以使用@Lundin帖子中指出的void*
。如果您使用int *data
代替,那么您的代码将是最佳的,因为在此处使用void*
指针并没有多大意义。如果您决定这样做,您的代码可以是:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *data;
data = malloc(sizeof(int)*2);
data[0] = 5;
data[1] = 10;
printf("%d\n", data[0]);
printf("%d\n", data[1]);
free(data);
return 0;
}
哪个更直接,并且省略了void*
指针带来的复杂性。
注意:您必须始终检查malloc()
的返回,因为它可以在失败时返回NULL
。
答案 2 :(得分:-2)
首先:请将data
的类型更改为int*
或至少更改为void*
。
除非你需要向函数传递指针,否则不要弄乱void**
。
秒:将data[0/1]
更改为&data[0/1]
。data[]
是一个参数,&data[]
是他的指针。如果您仍然使用void*
选择*((int*)data+?)
。如果yopu更改为int*
使用data[?]
。
第三:为什么在这个函数中使用指针?这不是一个需要指针的函数。
第四:我建议在这种情况下使用数组而不是指针。如果您已经知道参数的类型和大小,那么最好使用数组。更舒服。