原帖由 "yuxh" 发表:
个为什么就是 2, 3?
和地址有关。
原帖由 "思一克" 发表:
to: playmud
你觉得这样的程序有问题?
char *func()
{
char *s;
........ some code;
return s;
}
有问题吗
原帖由 "converse" 发表:
>;>;道的汇编代码怎么弄出来的?
gcc -c 产生.o文件,然后objdump -d查看o文件就可以了
原帖由 "converse" 发表:
我觉得还是有一点问题,在func中的汇编代码,leave之前的那一个:
2b: b8 00 00 00 00 mov $0x0,%eax
这个怎么解释?看不懂,这样的话每次返回回来的都是0x0呀??
原帖由 "思一克" 发表:
to playmud,
你错了。malloc()的内存func()返回时不会释放掉。
至于变量s, 会释放掉,但释放并不影响返回。
就如同:
int func()
{
int i;
i = 5;
return i;
}
正确一样。(i 不也“释放”掉?.........
原帖由 "playmud" 发表:
学了一招!!我用gdb里面的disassemble 如何能到到上面的效果?
原帖由 "playmud" 发表:
上面的这个没有问题,因为他传递的是一个值,
int i=func();
这个没有问题的,但是如果是char *的话就有问题了,
char * str=(char *)malloc(100);
str=func();
这样str原来分配的空间就泄漏了.
原帖由 "aero" 发表:
?啥效果。gdb就是gdb的显示方法,^_^。
另外,你们为啥都不用gcc的-S参数啊?然后直接看.s文件,多方便啊?不像dump出来的,全是立即数。
原帖由 "aero" 发表:
str这个变量的4个字节空间是释放了。可是它分配的空间没有释放,这个你也明白,你说它是泄漏了。其实如果函数返回的时候,将str的值传出来,调用函数再精确的进行控制和处理,这段空间还是可控的,不算是泄漏的。
原帖由 "思一克" 发表:
to playmud,
我再重复:
char *func()
{
char *s;
s = malloc(1234);
return s;
}
是正确的。
我无法再详细说了,你可以问aero或斑竹win_hate, flw等。
原帖由 "playmud" 发表:
这样说是没错,但是不能提倡这么做.
原帖由 "思一克" 发表:
to playmud,
我再重复:
char *func()
{
char *s;
s = malloc(1234);
return s;
}
是正确的。
我无法再详细说了,你可以问aero或斑竹win_hate, flw等。
原帖由 "思一克" 发表:
to playmud,
我再重复:
char *func()
{
char *s;
s = malloc(1234);
return s;
}
是正确的。
我无法再详细说了,你可以问aero或斑竹win_hate, flw等。
原帖由 "playmud" 发表:
s = malloc(1234);
这种把s声明为char *,非配空间的时候不加说明的,我这里编译不过去.
原帖由 "playmud" 发表:
你的可以通过?
6 test.cpp invalid conversion from `void*' to `char*'
你的编译器是不是检查不严格?
原帖由 "playmud" 发表:
不见得是正确的.程序员应该严谨.
而且这种做法是不提倡的,资源的申请和释放应该在同一个层次里面.
[root@PPC ftp]# ./a.out
number 2, number 2
[root@PPC ftp]#
原帖由 "twen345" 发表:
C和C++的区别,用gcc可以通过
原帖由 "playmud" 发表:
上面是警告吗?
编译器: Default compiler
执行 g++.exe...
g++.exe "D:\temp\test.cpp" -o "D:\temp\test.exe" -I"D:\Dev-Cpp\include\c++\3.3.1" -I"D:\Dev-Cpp\include\c++\3.3.1\mingw32" -I"D:\Dev-Cpp..........
原帖由 "playmud" 发表:
gcc也一样,呵呵.
主要是cpp对类型检测比c严格.
原帖由 "win_hate"][root@PPC ftp 发表:
# ./a.out
number 2, number 2
[root@PPC ftp]#
原帖由 "FH" 发表:
这么简单的问题还在没完的讨论么?
因为执行到printf函数的时候,Func(1)、Func(2)都已经执行完毕,printf只是打印堆栈里存的那个地址下的数据,因此两次的结果必然相同。
至于是打印1还是2则要看系统的压栈顺序,..........
原帖由 "思一克" 发表:
标准C的压栈次序(也是计算参数的次序)是从右到左,和系统,编译都无关,是标准C必须遵循的。
要在C程序中改变这个次序,有些编译可以定义函数的修饰符,如PASCAL等。
标准PASCAL是从左到右。
原帖由 "win_hate" 发表:
参数传递的方式取决于 ABI,编译器必须遵循系统所使用的 ABI,这样编译出来的程序或库才能与其他程序或库协同工作。
比如我给出的例子,那是 ppc32 的 SVR4 abi,其参数首先从寄存器传递,所以在参数个数不是..........
原帖由 "playmud" 发表:
我看的一些文章也是说压栈顺序是c决定的,和平台,编译器无关.
原帖由 "ISO/IEC 9899:1999(E)" 发表:
3.4.4
1 unspecified behavior
behavior where this International Standard provides two or more possibilities
imposes no further requirements on which is chosen in any instance
2 EXAMPLE An example of unspecified behavior is the order in which the arguments
to a function evaluated.
原帖由 "yuxh" 发表:
*(magic(1))的值是1,入栈的是1而不是a的地址,因而入栈的是2,1,结果就是1 2
第三个一样
----------运行 ----------
example 1: 1 1
example 2: 1 1
example 3: 1 2
输出完成 (耗时 0 秒) - 正常终止
example 1: 1 1
example 2: 1 2
example 3: 1 2
Press any key to continue
原帖由 "aero" 发表:
我是说的参数计算顺序,又没说入栈顺序。yuxh的例子,明显是从左到右计算的参数。
话又说回来,的确一般的compiler都是从右至左入栈,但这个是标准规定的吗?我不清楚。
example 1: 2 2
example 2: 2 2
example 3: 2 2
"d:\opt\lcc\lcc\test.exe"
Return code 0
Execution time 0.016 seconds
Press any key to continue...
原帖由 "yuxh" 发表:
*(magic(1))的值是1,入栈的是1而不是a的地址,因而入栈的是2,1,结果就是1 2
第三个一样
原帖由 "思一克" 发表:
sprintf(s, "number %d", n);
return s;
}
main()
{
printf("%s, %s\n", Func(1), Func(2));
}
结果是number 1, number 1?
欢迎光临 Chinaunix (http://bbs.chinaunix.net/) | Powered by Discuz! X3.2 |