我的问题是关于交换字符指针算法的效率。
为什么其中一条注释行导致我的编译器抛出错误?
同样的逻辑用于交换带有temp的b,但是同样的逻辑会导致错误,同时在temp和a的相同函数中重复?
谢谢大家。
#include <iostream>
void sawp ( char *a, char *b, int l)
{
char * prtA = a;
char * prtB = b;
char *temp = (char *)calloc(l, sizeof(char));
while(*(char*)b)
{
*(char*)temp= *(char*)b;
// *(char*)b = *(char*)a;
// *(char*)a = *(char*)temp;
std::cout<<*(char*)temp<<std::endl;
b++;
temp++;
a++;
}
}
int main()
{
char *a="Name";
char *b="Lastname";
sawp (a,b,sizeof(b));
return 0;
}
答案 0 :(得分:2)
修改字符串文字会导致未定义的行为。 它可能会导致崩溃。 字符串文字是只读的,因此无法修改。
所以
*b = *a;
是一个错误。
如果要修改字符串,则应具有读写权限。 所以
char a[10] = "name1";
char b[10] = "name2";
然后你可以
*b = *a; /* In your sawp() function */
答案 1 :(得分:2)
编写char *a="Name"
编译器会将"Name"
字符串视为常量字符串,并将其放在rom内存部分中。 rom memory部分是一个只读部分,代码无权在运行时更改它,因此当您尝试更改它时会出现分段错误。
答案 2 :(得分:0)
你看过这个条目了吗? Swapping pointers in C (char, int)
最后,有一个关于如何交换字符的解释。也许它适合你。
答案 3 :(得分:0)
为避免Gopi发布的文字问题,您可以在main中使用字符数组而不是指针,并确保它们的大小相同,例如:
char a[10] = {'N','a','m','e',0,0,0,0,0,0};
char b[10] = {'L','a','s','t','n','a','m','e',0,0};
/* ... */
sawp(a, b, sizeof(b));
或者如果您仍想使用指针,可以使用malloc()(假设这是C而不是C ++)为字符串分配空间,然后将文字复制到您分配的字符串中。