prin("sssss");
prin(str);
我在处理文件的时候发现前一句会把整个字符串压栈,再call,而后一句只是把str的地址压栈就call了,求大神讲解一下,我的编译器是gcc
5 个解决方案
#1
c语言啊 纯概念问题 有点记不清了
我大概给你说下
你知道对于c语言来说,有五种存储空间吧 这五种具体的名字我记不清了 总之里面有一种是专门存放字符串常量的 就像你写的“sssss” 所以如果你直接显示“ssssss” 那么就会直接把这个字符串拿来 这就是为什么你看到压栈的是整个字符串
而如果是通过str而拿到字符串的话,那么首先,str是一个普通的数组 或者说 它就是个普通的数据 所以自然是压它入栈了 然后才是通过它找到对应的字符串
我想你是忽视了这里的存储空间的不同才有的这个问题 只要你知道,str和“sssss”不在同一种存储空间里 你应该就明白了吧~
原谅我忘了具体的概念名词~~自己上网查查吧
我大概给你说下
你知道对于c语言来说,有五种存储空间吧 这五种具体的名字我记不清了 总之里面有一种是专门存放字符串常量的 就像你写的“sssss” 所以如果你直接显示“ssssss” 那么就会直接把这个字符串拿来 这就是为什么你看到压栈的是整个字符串
而如果是通过str而拿到字符串的话,那么首先,str是一个普通的数组 或者说 它就是个普通的数据 所以自然是压它入栈了 然后才是通过它找到对应的字符串
我想你是忽视了这里的存储空间的不同才有的这个问题 只要你知道,str和“sssss”不在同一种存储空间里 你应该就明白了吧~
原谅我忘了具体的概念名词~~自己上网查查吧
#2
不是直接把整个串压栈吧?能给提供个截图吗?
据说C语言从不会直接操纵整个字符串的,无论你使用数组还是常量字符串,都是只使用它的首地址的。
是不是LZ看错了?
据说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”不在同一种存储空间里 你应该就明白了吧~
原谅我忘了具体的概念名词~~自己上网查查吧
我大概给你说下
你知道对于c语言来说,有五种存储空间吧 这五种具体的名字我记不清了 总之里面有一种是专门存放字符串常量的 就像你写的“sssss” 所以如果你直接显示“ssssss” 那么就会直接把这个字符串拿来 这就是为什么你看到压栈的是整个字符串
而如果是通过str而拿到字符串的话,那么首先,str是一个普通的数组 或者说 它就是个普通的数据 所以自然是压它入栈了 然后才是通过它找到对应的字符串
我想你是忽视了这里的存储空间的不同才有的这个问题 只要你知道,str和“sssss”不在同一种存储空间里 你应该就明白了吧~
原谅我忘了具体的概念名词~~自己上网查查吧
#2
不是直接把整个串压栈吧?能给提供个截图吗?
据说C语言从不会直接操纵整个字符串的,无论你使用数组还是常量字符串,都是只使用它的首地址的。
是不是LZ看错了?
据说C语言从不会直接操纵整个字符串的,无论你使用数组还是常量字符串,都是只使用它的首地址的。
是不是LZ看错了?
#3
“ssssssss”本身被保存在文字常量区域,str[20] = "sssssssss"被保存在栈空间中。当作为参数的时候str可以通过地址找到整个字符串,而"ssssssss"在你的C语言程序中没有标识,所以编译器本身是找不到的,因此需要直接将整个字符串压入栈中(如果优化的话还可能也是将str指针入栈,因为它们的内容相同)。知道这个就够了。无论是gcc编译器还是vs编译器都有自己处理C语言规定的方式,具体方式我们不得而知,而且编译器本身将C转换为指令的时候,存在很多的优化,背着编程人员作了很多事情。所以我觉得楼主理解到它们保存在什么地方就够了。个人意见,仅供参考!
#4
谢谢楼上几位的回答啊,经过查看,发现字符串常量是被储存在.rodata区域的
#5
我觉得,不论使用字符串还是字符数组,进栈的都是地址引用,不会直接操作堆上的实际存储值。