【发布时间】:2011-01-21 02:41:11
【问题描述】:
我在 x86_32 上运行 ubuntu...并且在运行此程序时不断出现分段错误。
enter code here
#include<stdio.h>
#include<stddef.h>
char *memcp(char *dest, const char *src, size_t n)
{
char *dp = dest;
const char *sp = src;
while(n--)
*dp++ = *sp++;
return dest;
}
int main()
{
char *s = "abcde";
char *d;
char *r = memcp(d,s,6);
printf("%s",r);
return(0);
}
这段代码的问题是它运行在我朋友的 x86_64 机器上的 windows 和 ubuntu 上。请帮帮我..
【问题讨论】:
-
@user583878:你正在写一个未初始化的指针,伙计。 *dp++;您是在向随机内存位置写入一些数据吗?有时是SF,有时不是,这取决于它是否通过了当前为程序分配的段! ——阿图尔·穆斯塔芬
-
@user583878:所有未初始化的指针仍然初始化(堆栈分配,如果没有完全优化 - 如果不使用则被淘汰),所以如果我以后以某种方式破坏堆栈状态,(通过调用 dll 导出函数,即),我以后可以以某种有用且有意义的方式使用此指针;)顺便说一下,看看你的代码!你也在做同样的事情,所以我对未初始化指针的错误使用仍然是正确的)))
-
@Artur:这是一个可怕的建议,你应该永远 永远依赖未定义的行为,即使它似乎正在工作。如果你这样做,你将大大降低代码的可移植性和可靠性。当涉及到未定义的行为时,编译器根本不需要保证任何事情。
-
@dreamalax:你知道,我在这里没有给出建议。请告诉我,你为什么认为我在宣传这种可疑的东西?我刚刚说过 我 可以使用它(不是帖子的作者)的名字,例如在带有 __asm、__emb、__declaspec(noalias)、__declsec(naked) 的 coulpls 中(使用 VC++),所以,我只是不同意你的分类,但我很伤心,使用未初始化的指针是一种不好的做法,而你实际上可以。我没有,所以你应该在使用这样的赞誉时保持礼貌,伙计。实际上,这并不聪明
-
真的,任何人都可以使用未初始化的指针,... 但只能将其解释为 ponter itsels,而是一个内存位置 如果您没有初始化指针,但是为该指针分配了一些堆栈,为什么不使用这个空间,尽管它在 C/C++ 中被声明为指针,但是 你比其他人更聪明 并将它用作内存位置(不是作为另一个内存位置的参考)?
标签: c segmentation-fault