Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更改char*数组中的一个字符而不转换为char[][]_C_Arrays_Segmentation Fault - Fatal编程技术网

更改char*数组中的一个字符而不转换为char[][]

更改char*数组中的一个字符而不转换为char[][],c,arrays,segmentation-fault,C,Arrays,Segmentation Fault,我有一个不同长度的字符串文本的一维数组,如下所示: char *map[] = { "ABC", "ABCDEF", ... }; 我想用map[y][x]='x';,更改数组中的某个字符;,它不应该也不应该按照。我还了解到,将其声明为char-map[][]将修复该错误。但是,这是一个非常大的数组,因此将其转换为char map[][]是不切实际的。有没有其他方法可以实现我想要的功能?您不能更改字符串文本。它们在C/C++中是不可变的 数组的定义越正确,如下所示 const char *ma

我有一个不同长度的字符串文本的一维数组,如下所示:

char *map[] = {
"ABC",
"ABCDEF",
...
};

我想用map[y][x]='x';,更改数组中的某个字符;,它不应该也不应该按照。我还了解到,将其声明为char-map[][]将修复该错误。但是,这是一个非常大的数组,因此将其转换为char map[][]是不切实际的。有没有其他方法可以实现我想要的功能?

您不能更改字符串文本。它们在C/C++中是不可变的

数组的定义越正确,如下所示

const char *map[] = {
"ABC",
"DEF",
...
};
必须使用二维字符数组才能更改其元素

比如说

char map[][4] = {
    "ABC",
    "DEF",
    ...
    };

或者,您可以使用指针数组,通过为其分配新的字符串文字来更改所需元素。

如果您希望能够更改数组中包含的字符串,则必须使用动态分配的内存。我将分配一个char*数组,然后运行并为每个char*分配内存,然后调用strncpy或类似命令

char** ptrArray = malloc(sizeof(char*)*NUM_STRINGS); 
...
ptrArray[0] = malloc(sizeof(someString)*sizeof(char));
strncpy(ptrArray[0], someString, sizeof(someString)); 

这实际上取决于应用程序的上下文

这是指向位于只读内存节中的字符串的指针数组:

char* map[] =
{
    "ABC",
    "DEF",
    ...
};
char map[][MAX_STR_LEN+1] =
{
    "ABC",
    "DEF",
    ...
};
您可以更改每个指针的值,但不能更改指向内存的内容


这是指向位于读/写内存段中的字符串的指针数组:

char* map[] =
{
    "ABC",
    "DEF",
    ...
};
char map[][MAX_STR_LEN+1] =
{
    "ABC",
    "DEF",
    ...
};
不能更改每个指针的值,但可以更改指向内存的内容

请注意,在第二个方案中,您基本上有两种选择:

将数组声明为全局变量,在这种情况下,它将驻留在可执行映像的数据部分,并与之一起加载到内存中,即不执行初始化代码

将数组声明为局部变量,在这种情况下,函数将包含一段额外的代码,用于在每次调用该数组时将所有字符串从RO数据段复制到堆栈中,初始化该数组


编辑:上面的代码用指向可写字符数组的指针替换指向字符串的指针,从而产生所需的可写行为。

我忘了提到字符串的长度不同。@unamedguy查看我更新的帖子。考虑到在数组中存储字符串还是在所有字符串文本都不同的情况下存储指向字符串文本的指针没有区别,这就是我要寻找的+1但是,当我试图打印它时,它也会打印一些垃圾。@theunamedguy您没有指定数组最左边的大小。它必须足够大,以容纳每个字符串文字,包括其终止零。请参阅我文章中二维数组的定义。您应该用值4替换最大字符串文字的实际大小。如果您不介意浪费一点空间,我将使用@vladfrommosco的答案。这是迁移代码的最简单的方法。@RSahu,Vlad的答案是可行的,但打印数组时也会打印出一些垃圾。sizeofchar的定义是1。这可以工作,但需要在启动时初始化整个数组。我总是倾向于将它放在那里。我理解char是什么,但我没有意识到它在所有编译器中都是标准的。我从未遇到过sizeofchar>1,但为了以防万一,我想我总是包含它。@theunamedguy,它取决于应用程序的上下文。如果你小心的话,如果你需要更多或更少的东西,你总是可以重新定位。当然,可以随时为每个指针分配内存和复制数据。@sherrellbc:sizeof基本上以字符为单位度量。评估sizeofchar就像问一个米有多少米?这实际上比Vlad的答案好,因为它允许我打印出来