C中二维数组的strcpy问题

问题描述

我正在尝试使用 strcpy 函数一个字符串复制到一个字符串数组,但它不起作用!

代码如下:

char *message[10] = { "Hello!000000000000","Good Bye!","1202","hel","beh","cheshm" };
char *dst = "copy";

strcpy(&(message[0]),"copy");
printf("%s",message[0]);

解决方法

您有两个问题:

  1. strcpy 需要类型为 char * 的目标参数。但是由于 message[0] 是一个 char *,那么 &message[0] 是一个指向该指针的指针,其类型为 char **。换句话说,您传递了错误的指针作为目的地。这会导致未定义行为

  2. 当您修复第一个问题时会出现第二个问题,那就是您必须记住文字字符串是不可修改的。它们实际上是只读的。并且您尝试将一个字符串复制到 message[0] 指向的文字字符串中。尝试修改文字字符串会导致未定义的行为。

解决第二个问题的方法是使用char的数组:

char message[][256] = { ... };

第一个问题的解决方案是简单地传递message[0]

strcpy(message[0],"Copy");
,

strcpy 调用的第一个参数不是 char 的可修改数组,而是 char* 的数组,导致类型不匹配和意外行为。

将代码修改为 strcpy(message[0],"Copy") 会导致另一个问题,因为您将尝试修改 "Hello!000000000000" 指向的字符串文字 message[0]

如果你只是想修改数组元素,只需使用一个简单的赋值来改变指针:

char *message[10] = { "Hello!000000000000","Good Bye!","1202","hel","beh","cheshm" };
char *dst = "Copy";

message[0] = "Copy";
printf("%s",message[0]);

请注意,message 不是 3 维数组。它是一个指向 char 的指针数组。您可以将其定义为具有相同初始值设定项的实际二维数组,并且其内容是可修改的:

char message[10][20] = { "Hello!000000000000","cheshm" };
char *dst = "Copy";

strcpy(&(message[0]),"Copy");
printf("%s",message[0]);