我正在自书中学习C,目前正在研究指针和数组。
#include <stdio.h>
#include <string.h>
#define LINES 5
void main()
{
char* str[LINES];
str[0] = "hola";
str[1] = "mundo";
*(*(str + 0) + 1) = 'Z';
printf("%c", *(*(str + 0) + 1));
}
在这里,我想用“ Z”替换“ hola”的“ o”,但是它不起作用。 如果我删除: ((str + 0)+1)='Z'; 我在输出中得到“ o”,但是如何替换字符串的字符?
答案 0 :(得分:5)
您尝试修改undefined behavior时,您的程序有String Literal:
str[0] = "hola";
str[1] = "mundo";
*(*(str + 0) + 1) = 'Z'; // This is UB
从C标准#6.4.5p7 [字符串文字]
如果这些数组的元素具有适当的值,则不确定这些数组是否不同。如果程序尝试修改这样的数组,则行为是不确定的。
根据Stargateur的建议,您可以像这样使用strdup()
:
str[0] = strdup("hola");
str[1] = strdup("mundo");
strdup()
复制给定的字符串。它使用malloc
获取新字符串的内存。完成后,请确保将其释放,例如:
free (str[0]);
free (str[1]);
此外,使用void
作为main
函数的返回类型也不符合标准。 main
函数的返回类型应为int
。