在C中定义字符串的正确方法是什么?

时间:2012-04-01 14:25:04

标签: c

在C中定义字符串的正确方法是什么? 使用:

char string[10];

char *string="???";

如果我使用数组,我可以使用任何指针指向它然后操纵它。 似乎使用第二个将导致麻烦,因为我们没有为此分配内存。我被教导数组只是一个指针值,我以为这两个是相同的。 直到我做了string* = *XXXX这样的事情,并意识到它不像指针那样工作。

2 个答案:

答案 0 :(得分:1)

正如@affenlehrer所指出的,你如何“定义”一个字符串取决于你想如何使用它。实际上,在C中“定义”一个字符串实际上只是将它放在程序中的某个地方。您应该阅读更多有关内存如何工作以及在C中分配的内容,但如果您写下:

char *ptr = "???"

编译器将采用字符串“???” (这实际上是四个字节的数据,三个'?后跟一个NUL终结符的零字节)。它会将它插入程序中的某个静态位置(称为.bss segment),当程序开始运行时,ptr的值将被初始化为指向内存中的该位置。这意味着您有一个指向四个字节内存的指针,如果您尝试在这些字节之外写入,那么您的程序正在做一些不好的事情(并且可能违反了内存安全性)。

另一方面,如果你写

char string[10];

然后这基本上告诉编译器在你的10个字节的程序中分配一些空间,并使变量'string'指向它。这取决于你把它放在哪里:如果你把它放在一个函数中,那么你将有一个10字节的堆栈分配缓冲区。如果你操作这个缓冲区里面一个函数,然后不用指针做任何事情,那你就没事了。但是,如果你传回字符串的地址 - 或以任何方式使用指针 - 在函数返回后,你就错了。这是因为,在函数返回后,您将丢失所有堆栈分配的变量。

答案 1 :(得分:0)

还有更多方法可以在C中创建字符串(例如使用malloc)。你的用例是什么?基本上你需要在内存中存储数据的位置(在堆栈上,在堆上,静态,如第二个例子中),然后是一个指向字符串第一个字符的字符指针。大多数字符串相关函数将通过尾部'\ 0'“看到”字符串的结尾,在其他一些情况下(主要是通用数据相关函数),您还必须提供字符串的长度。