Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 - Fatal编程技术网

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

在C中定义字符串的正确方法是什么?,c,C,在C中定义字符串的正确方法是什么? 使用: 或 如果我使用数组,我可以使用任何指针指向它,然后操纵它。 似乎使用第二个会带来麻烦,因为我们没有为此分配内存。我被教导数组只是一个指针值,我以前以为这两个是一样的。 直到我做了类似于string*=*XXXX,并意识到它不像指针那样工作。在C中创建字符串的方法更多(例如使用malloc)。你的用例是什么?基本上,您需要在内存中存储数据的位置(在堆栈上,在堆上,在第二个示例中是静态的),然后是指向字符串第一个字符的字符指针。大多数与字符串相关的函数将通

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

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

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

正如@Affenleher指出的,如何“定义”字符串取决于您希望如何使用它。实际上,在C中“定义”字符串实际上相当于将它放在程序中的某个地方的引号中。您可能应该阅读更多关于C语言中内存如何工作和分配的内容,但如果您写:

char *ptr = "???"
发生的情况是编译器将获取字符串“?”(实际上是四个字节的数据,三个“?”后跟一个零字节表示NUL终止符)。它将在程序中的某个静态位置(称为)插入,当程序开始运行时,ptr的值将初始化为指向内存中的该位置。这意味着您有一个指向四个字节内存的指针,如果您试图在这些字节之外进行写操作,那么您的程序正在做一些不好的事情(可能会违反内存安全)

另一方面,如果你写

char string[10];

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

数组不是指针,指针也不是数组。您可能会喜欢“?”的第6节,它是一个文本,在静态存储中分配。在许多情况下,数组的行为类似于指针(反之亦然),但当您放松警惕时,会有一些差异困扰您。可能的重复项本身就是的重复项,而这是的重复项
char *ptr = "???"
char string[10];