gpt4 book ai didi

c - 为什么字符串 "exist"和字符内存与字符串内存不同?

转载 作者:太空狗 更新时间:2023-10-29 16:10:14 25 4
gpt4 key购买 nike

我在大学学习了 4 个月的 C 编程。我的教授总是说弦并不真正存在。自从我完成了那两门小类(class)后,我才真正开始编程(java)。我不记得为什么字符串并不真正存在。我以前不关心这个,但我现在很好奇。它们为什么不存在?它们存在于 Java 中吗?我知道它与“引擎盖下的字符串只是字符”有关,但这是否意味着字符串都保存为多个字符等?这不会占用更多内存吗?

最佳答案

string type 在 C 中不存在,但 C strings 确实存在。它们被定义为空终止字符数组。例如:

char buffer1[] = "this is a C string";//string literal

在内存中创建一个看起来像这样的 C 字符串:

|t|h|i|s| |i|s| |a| |C| |s|t\r|i|n|g|\0|?|?|?|  
< string >

注意这不是字符串:

char *buffer2;  

直到它包含一系列以\0结尾的char,它只是一个指向char的指针。 (字符 *)

buffer2 = calloc(strlen(buffer1)+1, 1);
strcpy(buffer2, buffer1); //now buffer2 is pointing to a string

引用资料:
Strings in C 1
Strings in C 2
Stirngs in C 3
and many more...

编辑:
(解决字符串评论中的讨论:)

基于以下定义:(来自 here )

Strings are actually one-dimensional array of characters terminated by a null character '\0'.

首先,由于 null 终止 是有关 C 字符串的对话的组成部分,这里有一些说明:

  • 术语NULL 是一个指针,通常定义为(void*)0),或者只是 0。它可以并且通常用于初始化指针变量。
  • 术语“\0”是一个字符。在C中,它的意思完全一样作为整数常量 0 的东西。 (相同的值 0,相同的类型整数)。它用于初始化char 数组。

字符串的东西:

char string[] = {'\0'}; //zero length or _empty_ string with `sizeof` 1.    

内存中:

|\0|

...

char string[10] = {'\0'} also zero length or _empty_ with `sizeof` 10.   

内存中:

|\0|\0|\0|\0|\0|\0|\0|\0|\0|\0|  

...

char string[] = {"string"}; string of length 6, and `sizeof` 7.    

内存中:

|s|t|r|i|n|g|\0|  

...

char [2][5] = {{0}}; 2 strings, each with zero length, and `sizeof` 5.    

内存中:

|0|0|0|0|0|0|0|0|0|0| (note 0 equivalent to \0) 

...

char *buf = {"string"};//string literal.    

内存中:

|s|t|r|i|n|g|\0|

不是字符串的东西:

char buf[6] = {"string"};//space for 6, but "string" requires 7 for null termination.   

在内存中:

|s|t|r|i|n|g|  //no null terminator
|end of space in memory.

...

char *buf = {0};//pointer to char (`char *`).  

内存中:

|0| //null initiated pointer residing at address of `buf`  (eg. 0x00123650)

关于c - 为什么字符串 "exist"和字符内存与字符串内存不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com