我有一个非常简单的程序,但这给了我一个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';
}
在交换正常工作之前分配虚拟变量。交换后有什么问题。 感谢
答案 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);
将读取虚拟结尾,并且可能访问不允许读取的内存。