小心C语言野指针

11次阅读

共计 1421 个字符,预计需要花费 4 分钟才能阅读完成。

本博客 C 语言文章合集

指针是 C 语言一个很强大的功能。然而所谓成也萧何,败也萧何,用好了指针会使程序大放异彩,用错了指针轻者只是报个错,重者可能整个系统都崩溃了。本篇我们来谈谈指针一种错误的使用方法”野指针“。
野指针一般是指定义时没有给初值的指针变量。来看以下程序:

include <stdio.h>

include <string.h>

int main()
{
char *source1 = “abc”;
char *source2;
printf(“source2 的值是:%un”, source2);
strcpy(source2 , source1);
printf(“%s”,source2);

return 0;
}

这段程序定义了一个指向字符的指针 source2,但是没有给它一个初始值。下面的代码就是将字符串”abc“复制到 source2 中,编译的结果如下:
——————–Configuration: Test – Win32 Debug——————–
Compiling…
demo.c
D:CCodeTestdemo.c(8) : warning C4700: local variable ‘source2’ used without having been initialized
Linking…

Test.exe – 0 error(s), 1 warning(s)

编译给出一个告警,说 source2 没有初值就被使用了。你可以无视这个告警,并且运行程序,但是运行的结果可能是灾难性的。

由于 source2 在定义时没有给初值,程序运行时系统会默认给 source2 一个值,我们可以将程序中的
strcopy(source2 , source1);
printf(“%s”,source2);
这两行代码注释掉,然后运行程序,看看 source2 输出的值是多少。运行结果如下:

source2 的值是:3435973836
Press any key to continue

可见 source2 被系统赋予一个值 3435973836,而 3435973836 是一个内存的地址,至于是哪段内存地址,谁也不知道,可能是操作系统本身所在的内存地址,也可能是一个空的内存地址。如果是操作系统本身所在的内存地址,通过 strcopy 函数将”abc“复制给了这段内存地址,也就是修改了操作系统本身内存数据,你的计算机可能就崩掉了!所以指针在定义时一定要给一个初值,比如”NULL“。在本程序中,除了给 source2 赋初值外,还需使用 malloc 函数分配一块存储空间,使得 source2 指向这块存储空间。修改的程序如下:

include <stdio.h>

include <string.h>

include<malloc.h>

int main()
{
char *source1 = “abc”;
char *source2 = NULL;
printf(“source2 的初始值是:%un”, source2);
source2 = (char *)malloc(100);
printf(“source2 的分配值是:%un”, source2);
strcpy(source2 , source1);
printf(“%s”,source2);

free(source2);
source2 = NULL;

return 0;
}

在定义 source2 时赋初值 NULL,在使用 source2 时分配一段内存空间,不用 source2 时释放内存空间,并且重新赋值 NULL。

正文完
 0