std :: swap with pointer会产生分段错误

时间:2011-02-14 11:19:16

标签: c++ swap

我有一个非常简单的程序,但这给了我一个seg错误。从很长一段时间以来,我一直在苦苦挣扎。请帮忙。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>

main() {
char *database;
int ndata=4;
database="aaa4baa3bcd2aab5";
char *dummy;
dummy=(char *)malloc(16);
memcpy(dummy,database,16);
printf("%s\n",dummy);
std::swap(database,dummy);
dummy[2]='a';
}

在交换正常工作之前分配虚拟变量。交换后有什么问题。 感谢

4 个答案:

答案 0 :(得分:3)

database指向一个字符串文字,它被放入只读内存中,你不能写入它,即使指针的类型为char *而不是const char*。严格来说,文字属于const char *类型,并且不允许对char *类型指针进行赋值,但这是一种传统的隐式转换,至今仍然允许。

swap只交换指针本身,而不是指向它们。所以在swap dummy引用包含字符串文字的内存之后,你不允许写入。

也许您应该考虑使用std::string进行字符串处理,这允许简单的分配等,从而允许swap按预期工作。

答案 1 :(得分:1)

我会稍微改写你的代码而不改变它的含义

char *database = "aaa4baa3bcd2aab5";
char *dummy = (char *)malloc(16);
memcpy(dummy,database,16);
printf("%s\n",dummy);
std::swap(database,dummy);
dummy[2]='a'; //here you in fact attempt to modify a string literal

在您完成swap dummy之前database指向的点后,这是您不允许修改的字符串文字的地址。

另请注意,字符串文字有16个字符加上一个空终止符 - 总共17个字符,所以一旦你分配了大小为16的缓冲区并复制了文字,结果就不会终止。

答案 2 :(得分:0)

字符串文字是不可变的,尝试修改字符串可能会导致运行时失败。尽管该语言允许char*指向字符串文字,但在这种情况下应始终标记指针const:const char* database = "aaa4baa3bcd2aab5";

如果这样做,编译器会通知您不能交换这些指针(因为现在它们的类型不兼容),这样可以避免产生运行时错误的麻烦。


除此之外,您不应该将dummy打印为字符串,因为它不是以空值终止的。

答案 3 :(得分:0)

数据库包含17个字符:您计算的16个字符加上最终的'\ 0'。你只复制前16个,所以dummy不包含最后的'\ 0'。

因此printf("%s\n",dummy);将读取虚拟结尾,并且可能访问不允许读取的内存。