tem*_*ame 7 c arrays string c-strings
我见过的导游似乎没有解释得这么好.
我的意思是,你可以为a分配内存char*
,或者char[25]
改为编写内存?有什么不同?然后有文字,不能被操纵?如果要将固定字符串分配给变量,该怎么办?就像那样,stringVariable = "thisIsALiteral"
之后你如何操纵呢?
有人可以直接在这里设置记录吗?在最后一种情况下,使用文字,你如何处理空终止?我觉得这很混乱.
编辑:真正的问题似乎是,据我所知,你必须兼顾这些不同的结构,以完成甚至简单的事情.例如,只能char *
作为参数或返回值传递,但只能char[]
分配文字和修改.我觉得很明显,我们经常/总是需要能够做到这两点,这就是我陷入困境的地方.
das*_*ght 11
分配
char*
和char[25]
?有什么区别?
malloc
-ed字符串的生命周期不受其声明范围的限制.在简单语言中,您可以malloc
从函数返回-ed字符串; 你不能char[25]
在自动存储器中分配相同的功能,因为它的内存将在从函数返回时被回收.
可以操纵文字吗?
无法在适当的位置操作字符串文字,因为它们是在只读存储中分配的.您需要将它们复制到可修改的空间,例如静态,自动或动态空间,以便操作它们.这不能做到:
char *str = "hello";
str[0] = 'H'; // <<== WRONG! This is undefined behavior.
Run Code Online (Sandbox Code Playgroud)
这将有效:
char str[] = "hello";
str[0] = 'H'; // <<=== This is OK
Run Code Online (Sandbox Code Playgroud)
这也有效:
char *str = malloc(6);
strcpy(str, "hello");
str[0] = 'H'; // <<=== This is OK too
Run Code Online (Sandbox Code Playgroud)
你如何处理字符串文字的空终止?
C编译器为您处理空终止:所有字符串文字在末尾都有一个额外的字符,填充\0
.
您的问题涉及C中的三种不同结构:char数组,堆上分配的char指针和字符串文字.这些都是微妙的方式.
通过char foo[25]
在函数内部声明获得的Char数组,该内存在堆栈上分配,它只存在于您声明的范围内,但是已经为您分配了25个字节.您可以在这些字节中存储您想要的任何内容,但如果您想要一个字符串,请不要忘记使用最后一个字节来终止它.
定义的字符指针char *bar
只保存指向某些未分配内存的指针.要使用它们,您需要将它们指向某个东西,可以是一个数组,如before(bar = foo
)或分配空间bar = malloc(sizeof(char) * 25);
.如果你做后者,你最终应该释放空间.
字符串文字的行为取决于您使用它们的方式.如果你使用它们来初始化一个char数组,char s[] = "String";
那么你只需要声明一个足够大的数组来完全保存该字符串(以及null终止符)并将该字符串放在那里.它与声明一个char数组然后填充它一样.
另一方面,如果你将一个字符串文字分配给a char *
然后指针指向你不应该修改的内存.尝试修改它可能会也可能不会崩溃,并导致未定义的行为,这意味着您不应该这样做.
由于已经回答了其他方面,我只会添加一个问题" 如果你想要使用char*传递函数的灵活性,但是char []的可修改性 "
您可以分配一个数组并将相同的数组作为char*传递给函数.这就是所谓的通过引用传递并在内部只传递地址实际阵列(第一元件精确地地址),而不是拷贝整个的.另一个影响是在函数内部进行的任何更改都会修改原始数组.
void fun(char *a) {
a[0] = 'y'; // changes hello to yello
}
main() {
char arr[6] = "hello"; // Note that its not char * arr
fun(arr); // arr now contains yello
}
Run Code Online (Sandbox Code Playgroud)
对于使用malloc分配的数组也可以这样做
char * arr = malloc(6);
strcpy(arr, "hello");
fun(arr); // note that fun remains same.
Run Code Online (Sandbox Code Playgroud)
后来你可以释放malloc内存
free(arr);
Run Code Online (Sandbox Code Playgroud)
char*a,只是一个可以存储地址的指针,它可以是单个变量,也可以是数组的第一个元素.要洁具,我们必须在实际使用它之前分配给它.
相反,char arr [SIZE]在堆栈上创建一个数组,即它也分配SIZE字节.所以你可以直接访问arr [3](假设3小于SIZE)没有任何问题.
现在允许为a分配任何地址是有意义的,但不允许为arr分配任何地址,因为除了使用arr访问其内存之外没有其他方法.
归档时间: |
|
查看次数: |
12011 次 |
最近记录: |