Подтвердить что ты не робот

Изменение массива с помощью функции в C?

Я хочу вызвать функцию, и я хочу, чтобы эта функция меняла содержимое строки или массива в программе на константу.

Psuedocode:

some_array = "hello"
print some_array   #prints "hello"
changeArray(some_array)
print some_array  #prints "bingo"

Я знаю, что мне нужно передать указатель на эту функцию. Вот что я написал,

void changeArray(char *arr){
    arr = "bingo";
}

int main(int argc, const char* argv[]){
    char *blah = "hello";
    printf("Array is %s\n",blah);
    changeArray(blah);
    printf("Array is %s\n",blah);
    return EXIT_SUCCESS;
}

Как я могу это сделать?

4b9b3361

Ответ 1

Вы передаете указатель на массив по значению, а не по ссылке. Это должно быть:

void changeArray(char **arr){
    *arr = "bingo";
}

int main(int argc, const char* argv[]){
    char *blah = "hello";
    printf("Array is %s\n",blah);
    changeArray(&blah);
    printf("Array is %s\n",blah);
    return EXIT_SUCCESS;
}

Вы указали адрес функции "привет" на функцию changeArray, но в функции вы изменили переданное значение, а не исходный указатель. Изменение, которое я сделал, передает адрес указателя, и сам указатель изменяется в функции.

Пожалуйста, не char *blah = "hello"; определяет указатель на константную строку, а также *arr = "bingo";, это и то, и другое, но если вы решили изменить сама строку, вы не сможете.

EDIT:

Когда вы передаете аргумент, даже указатель, функции, вы фактически копируете его в какое-то место, где функция читает его оттуда (обычно это стек). Вы не передаете сам аргумент, а копию его. Когда функция изменяет его (например, в arr = "bingo";), он изменяет копию переменной, а не исходную переменную. Поэтому, чтобы изменить самую переменную, мы передаем адрес переменной функции (changeArray(&blah); - & означает address of-), а в функции мы модифицируем переменную, сохраненную в адресе, который мы передали (*arr = "bingo"; - * означает переменную в адресе arr).

Предполагая, что исходный указатель blah находится в адресе 0x00000000 и содержит адрес строки "hello", которая, например, 0x00000010. если вы передадите функцию blah в функцию, вы скопируете ее в новую переменную arr, которая находится в адресе 0x00000020, например

Variable    Address     content
-------------------------------
blah       00000000    00000010   (points to hello)
"hello"    00000010    "hello" (this is just an example, so don't be hard on me :) )
arr        00000020    00000010
"bingo"    00000030    "bingo" (and again...)

теперь, если вы измените содержимое arr, вы измените значение в адресе 0x00000020, но не значение в адресе 0x000000000, поэтому blah все еще содержит 00000010.

Variable    Address     content
-------------------------------
blah       00000000    00000010   (points to hello)
"hello"    00000010    "hello" (this is just an example, so don't be hard on me :) )
arr        00000020    00000030 (points to "bingo")
"bingo"    00000030    "bingo" (and again...)

Вместо этого мы копируем адрес blah, который равен 0x00000000, на arr, а в функции, которую мы говорим, - контент of arr - это адрес, перейдите на этот адрес и измените его содержимое, чтобы указать на строку "bingo". поэтому теперь содержимое в адресе 0x00000000 (которое blah) указывает на "бинго".

Variable    Address     content
-------------------------------
blah       00000000    00000030   (points to "bingo")
"hello"    00000010    "hello"    (this is just an example, so don't be hard on me :) )
arr        00000020    00000000   (points to `blah`)
"bingo"    00000030    "bingo"    (and again...)

Надеюсь, я тебя не смутил...

Ответ 2

В вашем коде нет массивов. Если вы на самом деле пытаетесь изменить то, на что указывает ваш указатель на символ бла, вам нужно передать указатель на указатель на функцию. Однако, если вы хотите сделать это с помощью массивов, вам нужно сделать что-то вроде:

void changeArray(char arr[]) {
  // or you can use char *arr, it the same thing from
  // the C compiler point of view
  strcpy(arr, "blah");
  // alternatively, you could set each element. i.e. arr[0] = 'b';
}

int main (int argc, char** argv) {
  char blah[100] = "hello"; // this is an array
  printf("Array is %s\n", blah);
  changeArray(blah);   // array decays to pointer
  printf("Array is %s\n", blah);
  return EXIT_SUCCESS;
}

Ответ 3

Вам нужно передать указатель на массив, а не на массив.

Другое дело: добавьте условие управления к вашей функции. подумайте: что произойдет, если "бинго" будет больше, чем strlen (some_array)? он даст вам ошибку, потому что в C вы должны malloc, если вам нужен размер массива, чтобы быть динамичным!