从指针数组替换特定字符

Deb*_*uxy 0 c arrays pointers

我是从一本书中自学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));
}
Run Code Online (Sandbox Code Playgroud)

在这里,我想用"Z"替换"hola"的'o',但它不起作用.如果我删除: ((str + 0)+ 1)='Z'; 我在输出中得到'o'但是如何替换字符串的字符?

H.S*_*.S. 5

当您尝试修改String Literal时,您的程序具有未定义的行为:

    str[0] = "hola";
    str[1] = "mundo";
    *(*(str + 0) + 1) = 'Z';   // This is UB
Run Code Online (Sandbox Code Playgroud)

来自C标准#6.4.5p7 [String Literals]

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的.如果程序试图修改此类数组,则行为未定义.

正如Stargateur所建议的那样,你可以这样使用strdup():

    str[0] = strdup("hola");
    str[1] = strdup("mundo");
Run Code Online (Sandbox Code Playgroud)

strdup()复制给定的字符串.它用于malloc获取新字符串的内存.一旦完成它,请务必释放它,如下所示:

    free (str[0]);
    free (str[1]);
Run Code Online (Sandbox Code Playgroud)

此外,使用void返回类型的main功能不符合标准.main函数的返回类型应该是int.