2017-02-07 5 views
-1

私はメソッドを使って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); 
} 

編集:私は十分なスペースを割り当てるための最初の必要性あなたはポインタ

+2

あなたは1つの整数のためのスペースを割り当てるが、「バッファ」で第三にアクセスします。あなたのコードの動作は定義されていません。それを "修正"することはありません。 – StoryTeller

+2

1) 'c [2]'は未定義の動作です。 2) 'changevar(&c)'は制約違反(すなわち、非コンパイル可能)です。 'changevar'は' int * '引数を受け取ります。あなたは 'int **'引数を渡しています。 3)y = 8は制約違反(すなわち、非コンパイル可能)である。任意の整数をポインタに割り当てることはできません。 – AnT

+0

@AnTそれを指摘してくれてありがとう!私はもともと、パラメータが(int ** x)のchangevarを持っていた。私はどのようにx [2]を変えることができるか知っていますか? – reVolutionary

答えて

1

に新たなんだ:

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

お知らせI didn't cast the return valueいます。

値はではありません。はゼロに初期化されています。それらは何でもかまいません( "undefined")。

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

次に、あなたはあなたの関数にであるとして、この値に合格する必要があります:あなたはでそれをクリアすることができます。 (それは結局、既にポインタです。)

changevar(c); 

あなたの機能の中で、あなたがそれにアクセスするためのアドレスを間接参照する必要があります

*y = 8; 

それらは私が見エラーです。

0

私には2つの問題があります。

  1. あなただけのあなたのmalloc呼び出しで1 intにメモリを割り当てていますが3 intsの最小スペースを割り当てたことをお勧めメモリにアクセスしようとしています。
  2. 関数のパラメータはint*となっていますが、changevar(&c)ではポインタのアドレスを指定しているのでint**に渡しています。

変更が必要で、これらの夫婦のみを修正するには...

#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); 
} 

出力は次のようになります。配列cの大きさがあるので

here 0 
here 8 
0

ごみ値が印刷されています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 
関連する問題