当array + 1工作时,array [1]不起作用

时间:2017-02-27 07:37:10

标签: c pointers

据我所知,这个远数组[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错误消息,到目前为止,我真的想不出为什么其中一个会起作用而另一个不起作用的原因。

3 个答案:

答案 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[?]

第三:为什么在这个函数中使用指针?这不是一个需要指针的函数。

第四:我建议在这种情况下使用数组而不是指针。如果您已经知道参数的类型和大小,那么最好使用数组。更舒服。