2017-02-07 2 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); 
} 

EDIT: Я новичок в указатели

+2

Вы выделить пространство для одного целого, но доступ к третьим в «буфер». Поведение вашего кода не определено, нет «исправления». – 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.

Значения не, инициализированные до нуля. Они могут быть любыми («неопределенными»). Вы можете очистить его:

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

Далее, вам нужно передать это значение как к вашей функции. (Это уже указатель, в конце концов.)

changevar(c); 

В вашей функции, вам необходимо разыменованием адреса для доступа к нему:

*y = 8; 

Те ошибки, которые я вижу.

0

Так что есть две проблемы, которые выделяются для меня.

  1. Вы только выделения памяти для одной int в вашем malloc вызова, но при попытке получить доступ к памяти, что бы предложить вам выделили минимальное пространство для 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); 
} 

Выход становится:

here 0 
here 8 
0

значения для мусора печатаются, потому что размер массива c является 1.

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

создаст a rray c 1. 1.00. (В большинстве систем вместо номера мусора печатается 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 
Смежные вопросы