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

时间:2014-06-23 18:26:10

标签: c arrays segmentation-fault

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

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

我想用map[y][x]='X';更改数组中的某个字符,而char map[][]根据Wikipedia不会(也不应该)工作。我还读到,声明它char map[][]会解决这个问题。但是,这是一个非常大的数组,因此将其转换为{{1}}将是不切实际的。还有另一种方法可以实现我的目标吗?

5 个答案:

答案 0 :(得分:2)

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

您对数组的定义看起来越正确

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

您必须使用能够更改其元素的二维字符数组。

例如

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

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

答案 1 :(得分:2)

#include <stdio.h> 

#define CNV(x) (char []){ x }

int main(void){
    char *map[] = {
    CNV("ABC"),
    CNV("ABCDEF"),
    //...
    };
    map[1][2]='c';
    printf("%s\n", map[1]);//ABcDEF
    return 0; 
} 

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

这是一个指向字符串的指针数组,这些字符串位于只读存储器部分:

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

您可以更改每个指针的值,但不能更改指向内存的内容。


这是指向读/写内存部分的字符串指针数组:

char map[][MAX_STR_LEN+1] =
{
    "ABC",
    "DEF",
    ...
};

您不能更改每个指针的值,但可以更改指向内存的内容。


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

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

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

答案 4 :(得分:0)

#include <stdio.h>

char s1[] = "abcd";
char s2[] = "efghi";
char s3[] = "jklmnop";

char *s[] = {
  s1, s2, s3
};

int main(void)
{
  s[0][0] = '$';
  printf("%s %s %s\n", s[0], s[1], s[2]);
  return 0;
}

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