0

我下面有一个程序

void swap(char **s1,char **s2);

int main()
{
 char *list[] = {
       "Das",
       "Kannan",
       "Rajendran",
       "Shahul"
 };   



 printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

 swap(&list[0],&list[1]);

 printf("After swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

 return 0;

}

void swap(char **s1,char **s2)
{
 char *t;

 t = *s1;
 *s1 = *s2;
 *s2 = t;
}

我正在尝试交换 list[0] 和 list[1] 的地址。

Visual Studio 2008 在运行(开始调试)此程序时产生错误。产生的错误是

ConsoleApp.exe 中 0x1029984f (msvcr90d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000044。

没有编译错误。

我可以知道为什么指向使用的指针的指针不能正常工作。也想知道为什么 void swap(char *s1,char *s2) 也没有工作。

4

3 回答 3

3

Visual Studio 2008 在运行(开始调试)此程序时产生错误。

您的打印输出有问题。去掉星号:

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

swap(&list[0],&list[1]);

printf("After swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

为什么?嗯,是类型list[0]为 的字符串。这就是您想要传递给 printf 的内容。如果您使用星号取消引用该指针,您最终会将第一个字符传递给 printf,其中 printf 需要一个字符串。它最终试图将字符视为指针。的 ASCII 值是 68,或十六进制的 0x44,这样就解释了您收到的错误消息。"Das"char *'D'char *'D''D'

还想知道为什么 void swap(char *s1,char *s2) 也不起作用。

使用该函数,您将能够交换两个字符串中的字符,但您将无法交换字符串本身。将交换函数视为需要指向被交换对象的指针。如果你交换两个整数,你会有swap(int *i1, int *i2). 你想交换两个类型char *的字符串,这意味着交换函数需要两颗星:swap(char **s1, char **s2). 那有意义吗?

于 2009-12-25T07:23:56.873 回答
0

问题出在您的 printf 语句中。您正在取消引用您的字符串指针。从以下位置更改您的 printf:

printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

至:

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

(以及交换后的一个),一切都会好起来的。

于 2009-12-25T07:24:47.900 回答
0
printf("Before swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);
swap(&list[0],&list[1]);
printf("After swap list[0] = %s,list[1] = %s\n",*list[0],*list[1]);

你不需要char *在这里取消引用这些。相反,您应该这样做:

printf("Before swap list[0] = %s,list[1] = %s\n",list[0],list[1]);
swap(&list[0],&list[1]);
printf("After swap list[0] = %s,list[1] = %s\n",list[0],list[1]);

您的list数组包含char *元素,其中char *元素是指向 C 字符串(以空字符结尾的字符序列)的指针。通过取消引用它,您实际上是将每个字符串的第一个字符传递给printf,而不是字符串本身。当printf它自己尝试取消引用该字符值时,它会导致它尝试访问无效的内存段,从而导致分段错误。

于 2009-12-25T07:27:37.163 回答