请教,用字符串做参数和用字符数组做参数有何不同

时间:2023-01-07 16:48:23
char str[20]={"sssss"}
prin("sssss");
prin(str);
我在处理文件的时候发现前一句会把整个字符串压栈,再call,而后一句只是把str的地址压栈就call了,求大神讲解一下,我的编译器是gcc

5 个解决方案

#1


c语言啊  纯概念问题 有点记不清了

我大概给你说下

你知道对于c语言来说,有五种存储空间吧  这五种具体的名字我记不清了  总之里面有一种是专门存放字符串常量的 就像你写的“sssss”  所以如果你直接显示“ssssss” 那么就会直接把这个字符串拿来  这就是为什么你看到压栈的是整个字符串
而如果是通过str而拿到字符串的话,那么首先,str是一个普通的数组  或者说 它就是个普通的数据  所以自然是压它入栈了  然后才是通过它找到对应的字符串

我想你是忽视了这里的存储空间的不同才有的这个问题   只要你知道,str和“sssss”不在同一种存储空间里  你应该就明白了吧~

原谅我忘了具体的概念名词~~自己上网查查吧

#2


不是直接把整个串压栈吧?能给提供个截图吗?
据说C语言从不会直接操纵整个字符串的,无论你使用数组还是常量字符串,都是只使用它的首地址的。
是不是LZ看错了?

#3


“ssssssss”本身被保存在文字常量区域,str[20] = "sssssssss"被保存在栈空间中。当作为参数的时候str可以通过地址找到整个字符串,而"ssssssss"在你的C语言程序中没有标识,所以编译器本身是找不到的,因此需要直接将整个字符串压入栈中(如果优化的话还可能也是将str指针入栈,因为它们的内容相同)。知道这个就够了。无论是gcc编译器还是vs编译器都有自己处理C语言规定的方式,具体方式我们不得而知,而且编译器本身将C转换为指令的时候,存在很多的优化,背着编程人员作了很多事情。所以我觉得楼主理解到它们保存在什么地方就够了。个人意见,仅供参考!

#4


谢谢楼上几位的回答啊,经过查看,发现字符串常量是被储存在.rodata区域的

#5


我觉得,不论使用字符串还是字符数组,进栈的都是地址引用,不会直接操作堆上的实际存储值。

#1


c语言啊  纯概念问题 有点记不清了

我大概给你说下

你知道对于c语言来说,有五种存储空间吧  这五种具体的名字我记不清了  总之里面有一种是专门存放字符串常量的 就像你写的“sssss”  所以如果你直接显示“ssssss” 那么就会直接把这个字符串拿来  这就是为什么你看到压栈的是整个字符串
而如果是通过str而拿到字符串的话,那么首先,str是一个普通的数组  或者说 它就是个普通的数据  所以自然是压它入栈了  然后才是通过它找到对应的字符串

我想你是忽视了这里的存储空间的不同才有的这个问题   只要你知道,str和“sssss”不在同一种存储空间里  你应该就明白了吧~

原谅我忘了具体的概念名词~~自己上网查查吧

#2


不是直接把整个串压栈吧?能给提供个截图吗?
据说C语言从不会直接操纵整个字符串的,无论你使用数组还是常量字符串,都是只使用它的首地址的。
是不是LZ看错了?

#3


“ssssssss”本身被保存在文字常量区域,str[20] = "sssssssss"被保存在栈空间中。当作为参数的时候str可以通过地址找到整个字符串,而"ssssssss"在你的C语言程序中没有标识,所以编译器本身是找不到的,因此需要直接将整个字符串压入栈中(如果优化的话还可能也是将str指针入栈,因为它们的内容相同)。知道这个就够了。无论是gcc编译器还是vs编译器都有自己处理C语言规定的方式,具体方式我们不得而知,而且编译器本身将C转换为指令的时候,存在很多的优化,背着编程人员作了很多事情。所以我觉得楼主理解到它们保存在什么地方就够了。个人意见,仅供参考!

#4


谢谢楼上几位的回答啊,经过查看,发现字符串常量是被储存在.rodata区域的

#5


我觉得,不论使用字符串还是字符数组,进栈的都是地址引用,不会直接操作堆上的实际存储值。