为什么不改变这个价值呢?

时间:2017-02-07 18:56:45

标签: c

所以我试图使用一种方法将x [2]的值从0改为8,我的方法不起作用。我怎样才能做到这一点?我试着四处寻找但无济于事。

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

 void changevar(int* x){
    int* y;
    y = &x[2];
    y = 8;
 }
 int main(int argc, char** argv){
    int* c;
    c = (int*) malloc(sizeof(int));
    printf("here %d\n", c[2]);
    changevar(&c);
    printf("here %d\n", c[2]);
    free(c);
}

编辑:我是指针

的新手

3 个答案:

答案 0 :(得分:1)

首先需要分配足够的空间:

c = malloc(3 * sizeof(int));

请注意I didn't cast the return value

初始化为零。它们可以是任何东西(“未定义”)。你可以用以下方法清除它:

memset(c, 0, 3 * sizeof(int));

接下来,您需要将此值原样传递给您的函数。 (毕竟,它已经是一个指针。)

changevar(c);

在您的函数中,您需要取消引用该地址才能访问它:

*y = 8;

这些是我看到的错误。

答案 1 :(得分:0)

所以有两个问题对我有用。

  1. 您只在int来电中为一个malloc分配内存,但尝试访问内存,建议您为3 ints分配最小空格。
  2. 您的函数的参数应该是int*,但是changevar(&c)您传递的是int**,因为您提供了指针的地址。
  3. 要解决这些问题,只需进行一些更改......

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
     void changevar(int* x){
        x[2] = 8; // <-- can be simplified to this one line
     }
    
     int main(int argc, char** argv){
        int* c;
        int amt = 3; // <-- number of ints you want to be able to have space for
        c = malloc(sizeof(int) * amt); // <-- multiply the size and the amount you want
        printf("here %d\n", c[2]);
        changevar(c); // <-- remove the '&' from the argument to just pass the pointer 'c'
        printf("here %d\n", c[2]);
        free(c);
    }
    

    输出变为:

    here 0
    here 8
    

答案 2 :(得分:0)

正在打印垃圾值,因为数组c的大小为1。

c = (int*) malloc(sizeof(int));

将创建一个大小为1的数组c

c[2]是垃圾值。 (在大多数系统中,打印0而不是垃圾编号。)

您的&c[2]y未提及相同的地址。

你想做的可能就是:

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

void changevar(int** x){
    *(*x+2)=8;
}
 int main(int argc, char** argv){
    int* c;
    c = (int*) malloc(3*sizeof(int));
    for(int i=0;i<3;i++){
        c[i]=0;
    }
    printf("here %d\n", c[2]);
    changevar(&c);
    printf("\nhere %d\n", c[2]);
    free(c);
}

打印:

here 0
here 8