如何在C中处理字符串?
我使用64位的如何在C中处理字符串?,c,linux,string,C,Linux,String,我使用64位的linux机器,因此指针的大小为8字节,因此查看下面的代码,我在字符串中的H之后(在strcpy()。但似乎没有发生。使用下面的程序,我认为它会溢出并损坏x中的内存。下面的程序在我的系统上运行良好,但如果我在strcpy()中添加另一个字母,它就会出错。这样的问题显然是依赖于系统的,但是这个字符串如何不使程序崩溃呢?我确实搜索了这样一个问题,如果有一些链接,你也可以重新指导我。提前谢谢 int main() { int x; char* c ; x = 0xF0000000;
linux
机器,因此指针的大小为8字节,因此查看下面的代码,我在字符串中的H
之后(在strcpy()。但似乎没有发生。使用下面的程序,我认为它会溢出并损坏x
中的内存。下面的程序在我的系统上运行良好,但如果我在strcpy()
中添加另一个字母,它就会出错。这样的问题显然是依赖于系统的,但是这个字符串如何不使程序崩溃呢?我确实搜索了这样一个问题,如果有一些链接,你也可以重新指导我。提前谢谢
int main()
{
int x;
char* c ;
x = 0xF0000000;
strcpy(&c,"ABCDEFGHFFFFFF");
x++;
printf("%X\n",x);
printf("%s\n",&c);
}关于C语言中的指针和内存管理:
- 您必须手动创建指针
- 你必须手动分配内存
- 您必须手动初始化指针以指向分配的内存
表情
char *c;
仅创建指针,但既不为字符分配任何内存,也不初始化指向已分配内存的指针
你最好是:
char c[20];
c
的行为类似于指针,但同时分配了一个20字节的缓冲区(在main
的堆栈帧中),并且c
指向它的开始
使用字符串(字符指针)时,您不会将字符串复制到指针的地址,而是复制到指针持有的地址:
strcpy(c, "ABCDEFGHFFFFFF");
作为旁注:表达式“ABCDEFGHFFFFFF”
在内存中分配一个常量字符缓冲区,其中包含文本和终止零,并返回其地址。这就是为什么这种用法是合法的。我看到您声明了一个指针。。。但是它指的是什么呢?当然它会带着警告进行编译,但它确实给了我一个输出,如下所示f000001 ABCDEFGHFFFFFF
I现在这肯定是你编写常规程序的方式,我只是想看看字符串是如何被复制的,你们肯定没有答案。你的程序就是UB,没什么好争论的。如果您想知道在特定的运行中,在您的情况下究竟是什么,请中断调试器并单步执行它。请注意,使用调试器可能会更改程序的行为。您正在破坏内存<代码>字符*c
声明了一个指针,该指针在64位arch上包含8个字节,但它们未初始化,然后通过strcpy(&c)用更多的垃圾覆盖该指针(它将损坏内存第9个字符,但由于内存对齐,您的程序可能幸运地存活下来)。我看到您正在尝试并行使用x
,但不能保证它们以某种方式相邻分配。如果您想要这种混乱,请尝试使用union
类型。问题是您的意图不明确。通常编译器或内存管理器会分配多一点内存(例如字节对齐、内部分配簿记)这样的小溢出不会在操作系统级别触发SEGFULT,因为您的程序只是弄乱了一些内部内存(由库管理)。这就是为什么您的程序“幸运”的原因。您会在稍后的某个时间得到SEGFULT,这是您最意想不到的;-)如果要调试程序内存,请尝试valgrind工具。