尝试切换字符串中的字母时出现总线错误
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 );
下面是我的代码片段。我的代码应该只反转字母字符并跳过任何特殊字符。我目前正在尝试使用“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 );