Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中处理字符串?_C_Linux_String - Fatal编程技术网

如何在C中处理字符串?

如何在C中处理字符串?,c,linux,string,C,Linux,String,我使用64位的linux机器,因此指针的大小为8字节,因此查看下面的代码,我在字符串中的H之后(在strcpy()。但似乎没有发生。使用下面的程序,我认为它会溢出并损坏x中的内存。下面的程序在我的系统上运行良好,但如果我在strcpy()中添加另一个字母,它就会出错。这样的问题显然是依赖于系统的,但是这个字符串如何不使程序崩溃呢?我确实搜索了这样一个问题,如果有一些链接,你也可以重新指导我。提前谢谢 int main() { int x; char* c ; x = 0xF0000000;

我使用64位的
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工具。