使用C中的函数更改数组?

我想调用一个函数,我希望该函数将程序中字符串或数组的内容更改为常量。

伪代码:

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

我怎样才能做到这一点?

您是通过值而不是引用将指针传递给数组。 它应该是:

 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函数提供了“hello”的地址,但在函数中你更改了传递的值,而不是原始指针。 我所做的更改传递了指针的地址,并且在函数中更改了指针本身。

请不要char *blah = "hello"; 定义一个指向常量字符串的指针,以及*arr = "bingo"; ,这很好,但如果你考虑改变字符串本身,你将无法做到。

编辑:

当你将一个参数,甚至一个指针传递给一个函数时,你实际上将它复制到函数从那里读取它的某个地方(通常是堆栈)。 您不会传递参数本身,而是传递它的副本。 当函数修改它时(如在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并在我们所说的函数中 – “arr的内容是一个地址 ,转到此地址并将其内容更改为指向”bingo“字符串”。 所以现在地址0x00000000(这是blah )中的内容指向“bingo”。

 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...) 

希望我没有迷惑你……

您的代码中没有数组。 如果您实际上正在尝试修改您的blah字符指针所指向的内容,那么您需要将指针传递给指向该函数的指针。 但是,如果要使用数组执行此操作,则需要执行以下操作:

 void changeArray(char arr[]) { // or you can use char *arr, it's the same thing from // the C compiler's point of view strcpy(arr, "blah"); // alternatively, you could set each element. ie 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; } 

您需要将指针传递给数组而不是数组本身。

另一件事:为你的function添加一个控制条件。 想想:如果“bingo”比strlen(some_array)更大,会发生什么? 它会给你一个错误,因为在C中你需要malloc它,如果你需要数组大小是动态的!