簡単な答え:writeLocation
はローカル変数であり、のコピーですcryptedPointer
。を変更してもwriteLocation
、cryptedPointer
は変更されません。
を変更したい場合はcryptedPointer
、次のようにポインターを渡す必要があります。
#include <stdio.h>
int pointeeChanger(char** writeLocation) { /* Note: char** */
*writeLocation = "something"; /* Note: *writeLocation */
return 0;
}
int main(void)
{
char crypted[] = "nothing";
char* cryptedPointer = crypted;
pointeeChanger(&cryptedPointer); /* Note: &cryptedPointer */
printf("The new value is: %s", cryptedPointer);
return 0;
}
ただし、このコードには他にも問題があります。への呼び出し後、pointeeChanger()
はcryptedPointer
もはやcrypted
配列を指しません。あなたは実際にその配列の内容を変更したかったのではないかと思います。このコードではそれができません。
あなたの値を変更するには、または(できれば)crypted[]
を使用する必要があります。また、配列のサイズを監視する必要があります-はより長く、大きくしない限りバッファ オーバーフローが発生します。strcpy()
strncpy()
crypted[]
"something"
"nothing"
crypted[]
このコードは、元のcrypted[]
配列を変更します。
#include <stdio.h>
#include <string.h>
#define MAX_STR_LEN 64
/*
* Only char* required because we are not modifying the
* original pointer passed in - we are modifying what it
* points to.
*/
int pointeeChanger(char* writeLocation)
{
/*
* In C, you need to use a function like strcpy or strncpy to overwrite a
* string with another string. Prefer strncpy because it allows you to
* specify a maximum size to copy, which helps to prevent buffer overruns.
*/
strncpy(writeLocation, "something", MAX_STR_LEN);
/* strncpy doesn't automatically add a \0 */
writeLocation[MAX_STR_LEN] = '\0';
return 0;
}
int main(void)
{
/*
* The +1 is because an extra character is required for the
* null terminator ('\0')
*/
char crypted[MAX_STR_LEN + 1] = "nothing";
pointeeChanger(crypted);
printf("The new value is: %s", crypted);
return 0;
}