尝试切换字符串中的字母时出现总线错误

Getting a bus error trying to switch letters in a string

下面是我的代码片段。我的代码应该只反转字母字符并跳过任何特殊字符。我目前正在尝试使用“ab-cd”并希望打印“ba-cd”,但是当我 运行 我的代码出现总线错误时。

我已将问题缩小到第 31 行和第 32 行。我进行了 malloc,但不确定为什么它不允许我切换字符。

虽然没有显示,但我会确保使用free释放内存。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <cytype.h> // used for isalpha()

int main(int argc, const char *argv[])
{
    // declaring a pointer of type char to tempString
    char * tempString = (char *)malloc(sizeof(char)* 6);
    tempString = "ab-cd";

    char temp;
    temp = tempString[0];
    tempString[0] = tempString[1];
    tempString[1] = temp;

    printf("%s\n", tempString);

    return 0;
}

tempString = "ab-cd"; 行与您认为的不一样。就在前一行,您在 tempString 中存储了已分配缓冲区的地址。但是,在这一行中,您将 "ab-cd" 的地址存储在 tempString 中。您不是在写入缓冲区,而是导致 tempString 完全指向其他地方。

具体来说,您要将其指向存储在内存的只读部分中的字符串文字。因此,尝试在您正在执行的操作中更改它会使您的程序崩溃。

你想要的是将字符串写入你已有的缓冲区。这可以通过

来完成
strcpy(tempString, "ab-cd");

编辑(感谢@NateEldredge 抓住了这个):

您分配的缓冲区不够大,无法容纳 "ab-cd"。您需要更改分配的大小:

tempString = malloc(sizeof(char)*6);

对于初学者,您分配的内存不足以存储字符串 "ab-cd"

char * tempString = (char *)malloc(sizeof(char));

您只分配了一个字节,只能存储一个字符。

然后在下面的语句中,您将指针 tempString 重新分配给字符串文字 "ab-cd".

的第一个字符的地址
tempString = "ab-cd";

因此程序产生了内存泄漏,因为分配的内存地址丢失了。

然后你试图改变指针tempString现在指向的字符串文字。但是任何更改字符串文字的尝试都会导致未定义的行为。来自 C 标准(6.4.5 字符串文字)

7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.

不需要动态分配内存。您可以只声明一个字符数组并使用字符串文字对其进行初始化,例如

char tempString[] = "ab-cd";

如果你想动态分配一个数组你需要这样写

char *tempString = malloc( sizeof( "ab-cd" ) );
strcpy( tempString, "ab-cd" );

然后当不再需要数组时,您应该像

一样释放它
free( tempString );