你的C/C++程序为什么无法运行?揭秘Segmentation fault (1)
甚么让你对C/C++如此恐惧?晦涩的语法?还是优秀IDE的欠缺? 段毛病(Segmentation fault)这是新手没法避免的毛病,也是老手极力躲避也常常遇到的毛病。 先看两份代码,1份是毛病的. 毛病代码#include "string.h"
#include <stdlib.h>
#include <stdio.h>
void func1(char ** dest,char * src,int n) {
(*dest) = (char*)malloc(sizeof(char)*n);
strcpy(*dest,src);
}
int main(int argc,char** args) {
char ** p = NULL;
char str[] = "foreach_break";
int len = sizeof(str);
printf("%d
",len);
func1(p,str,len);
printf("%s
",*p);
free(p);
p = NULL;
} 正确代码#include "stdio.h"
#include "string.h"
#include "stdlib.h"
void func1(char ** dest,char** args) {
char * p = NULL;
char str[] = "foreach_break";
int len = sizeof(str);
printf("%d
",len);
func1(&p,len);
printf("%s
",p);
free(p);
//p = NULL;
} 代码意图来自技术问答中的1个huffman树不能运行的问题。 它们最大的不同: char ** p = NULL;
func1(p,str,len); 正确代码: char * p = NULL;
func1(&p,len); 或许你会奇怪,你看到“正确”的代码中竟然注释了这行: //p = NULL; 参数传递同时,可能有人会觉得指针 嗯。这类想法也很有惯性,由于C语言没有类似这样的函数声明: 运行程序那末,我们看看程序自己怎样说? 如果你常常遇到段毛病,希望你仔细看明白上面的图在说甚么。 野指针
零指针
悬浮指针你对在正确的程序中注释了 free(p); 这句代码的履行,会释放掉指针 p = NULL; 这句代码的履行,是让指针
由于我们的
所以我们可以毫无顾虑的注释掉 内存泄漏另外,如果
接着看程序现在,我们来看看函数 首先,是C代码: 然后是两段代码的对照: 你应当已看出了差别。 毛病的代码的 接着是履行: (*dest) = (char*)malloc(sizeof(char)*n); 这句代码在进行 究其缘由,就在于
试图访问1个不能被访问的空间,就会段毛病. 总结段毛病的1种,我们探索终了. /* p指向的地址,对其取值,如果这个地址有东西,也有权取,没问题.*/
char ** p -> *p; (1)
/* 寄存p的地址,或指向p的援用,这个地址必定有东西,所以没问题*/
char * p -> &p (2); 本篇结束. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |