char *returnString()
{
return "hello World";
}
int main()
{
printf("\n %p ", &returnString());
return 0;
}
returnString()
はこちらになりますか?それは'h'
のアドレスを返しますか?
ここにどこが"hello world"
(スタック/ヒープ)が格納されていますか?それを見る(印刷する)方法は?でもこの後--->result[0]
とresult[2]
のstrcpy(Hello, "String is Changed");
値は変更されませように、第二のプログラムで行う必要がありますどのような変更Cが1つの値(int、charなど)しか返せない場合、文字列リテラル(charの配列)をどのように返しますか?
char Hello[] = "It's Hello";
char something[] = "something like ";
char *readInput(char str[]) {
char *tempStr = NULL;
if (strcmp(str, "hello") == 0)
return Hello;
tempStr = (char *)malloc((strlen(something)) + (strlen(str)) + 1);
strcpy(tempStr, something);
strcat(tempStr, str);
return tempStr;
}
int main() {
int i;
char *userInput[] = { "hello", "xyz", "hello", "abc" };
char **result = (char **)malloc(sizeof(char *) * (4));
for (i = 0; i < 4; i++) {
result[i] = (char *)malloc(15);
result[i] = readInput(userInput[i]);
}
printf("\n\n");
strcpy(Hello, "String is Changed"); // this should not affect result[0] && result[2]
for (i = 0; i < 4; i++)
printf("\t\t %s", result[i]);
printf("\n");
return 0;
}
。
戻り値の型が文字列リテラルへのポインタである 'のchar *'、です。 – user3386109
文字列リテラルは 'char'の配列で、これを使うと配列の最初の要素へのポインタ、つまり最初の文字へのポインタを取得します。配列は最初の要素へのポインタに減衰するので、2番目のプログラムで 'Hello Hello'を実行するときは' return&Hello [0] 'と同じです。 –
2番目のプログラムではメモリリークがあります。ループ内のメモリを 'main'関数で割り当て、' result [i] 'に代入します。直後に、最初のポインタを失うのと全く同じ 'result [i] 'に再割り当てします。 –