今天重新拿起C语言的书学习学习,遇到了一个诡异的问题,开始不可理解,现在记录下整个分析过程。
首先上代码:
#include <stdio.h>
void strcopy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}
int main()
{
int i = 3;
char a[] = "abcdefg";
char *p;
strcopy(p, a);
printf("%d\n",i);
}
我估计大多数人看到这个程序都会认为会打印出3,但是结果出乎意料:
于是我分别做了两次修改,都使程序正常了。
第一次,我把strcopy函数注释掉了
#include <stdio.h>
void strcopy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}
int main()
{
int i = 3;
char a[] = "abcdefg";
char *p;
//strcopy(p, a);
printf("%d\n",i);
}
打印结果是3.
第二次,我把int i = 3;移动p指针下面定义:
#include <stdio.h>
void strcopy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}
int main()
{
char a[] = "abcdefg";
char *p;
int i = 3;
strcopy(p, a);
printf("%d\n",i);
}
也得到了正确的结果。
于是我用C free对原来的程序进行调试。
找到变量i的内存地址,可知其存放的是00000003,也就是数字3。
接着我执行strcopy方法后,就出状况了:
结果表明字符串被拷贝到了变量i的内存地址处。我对i处内存的内容进行十六进制转十进制,64636261转十进制后正好是1684234849.也就是这个诡异的输出结果。
综合以上的分析,所得结果如下:
#include <stdio.h>
void strcopy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}
int main()
{
int i = 3; //定义int型变量i,分配内存空间,并赋值
char a[] = "abcdefg";
char *p; //定义指针p,并为初始化指针的位置,在此程序中p默认指向了i的地址
strcopy(p, a);
printf("%d\n",i);
}
现在真相大白了,不过任然让我疑惑的在指针p被定义的时候,p的默认指向地址是否有规律可循呢?任旧是个疑问,还请看到这篇文章的各位童鞋指点一二。
不过这个程序本来就是写的有问题,C语言的内存分配果然很容易出错(⊙o⊙)…
我想正确的程序应该是这样的...
#include <stdio.h>
void strcopy(char *s, char *t)
{
while ((*s++ = *t++) != '\0')
;
}
int main()
{
int i = 3;
char a[] = "abcdefg";
char *p = (char *)malloc(sizeof(a)); //给指针分配新的内存空间
strcopy(p, a);
printf("%d\n",i);
}
另外,搜索了下,函数malloc()和函数calloc() 的主要区别是前者不能初始化所分配的内存空间,而后者能。

- 大小: 2.7 KB

- 大小: 18.7 KB

- 大小: 18.7 KB
分享到:
相关推荐
C语言指针练习填空和阅读程序题 本资源主要涵盖了C语言指针的相关知识点,包括指针的基本概念、指针运算、指针与数组的关系、指针与字符串的关系等。通过本资源的学习,可以帮助读者更好地理解和掌握C语言指针的...
c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针c语言指针...
c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 c语言指针详解 ...
本文将介绍C语言指针的基本概念、定义、初始化、运算以及与一维数组的关系。 首先,我们要理解内存地址的概念。在程序运行时,操作系统为代码和数据分配内存空间,每一个内存单元都有一个唯一的编号,称为内存地址...
从给定的文件信息来看,主要讨论了C语言中指针的概念、应用以及相关的知识点,通过一系列的选择题及其解析,加深对C语言指针的理解。接下来,我们将详细解析这些题目中涉及的重要知识点。 ### 1. 变量的指针 在...
【C语言指针课程PPT】讲解了C语言中核心的指针概念,它是C语言高效编程的关键。指针允许程序直接访问内存地址,增强了代码的灵活性和性能。以下是关于指针的详细知识点: 1. **变量与内存地址**: - 当在C语言中...
在本文中,我们将详细地探讨C语言指针的用法,帮助读者彻底搞懂并熟练运用这一强大工具。 首先,让我们来了解C语言中变量的存储实质。在计算机内存中,所有数据都是以二进制的形式存储的,每一块存储单元都有一个...
C语言指针题库 本资源摘要信息是关于C语言指针的题库,涵盖了计算机等级二级考试中的相关内容。该资源包含选择题和编程题,旨在帮助考生和学习者提高C语言指针的知识和技能。 指针基本概念 在C语言中,指针是一种...
《指针详解——C语言指针完全解析》 在C语言的世界中,指针是一个强大的工具,也是理解和掌握C语言的关键。本文将深入探讨指针的概念、类型、运算及其在笔试中的重要性。 首先,我们要了解什么是指针。指针是一个...
在C语言的学习中,指针是一个非常重要且复杂的概念,它允许程序直接访问内存地址。理解指针的工作原理和如何有效地使用指针对于编写高效和优化的C语言代码至关重要。 首先,指针是一种数据类型,其值为另一个变量的...
c语言 指针 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件 c语言指针课件
详细讲解了指针的用法和注意事项,指针是我们在学习C语言过程中的一个难点,所以就我个人的一点心得和大家分享一下
C语言中的指针是一个非常核心和重要的概念,它提供了操作内存空间的能力,这对于理解C语言和编写高效的代码至关重要。以下是对文件中提到的知识点的详细解释。 首先,指针概念的基础在于理解变量在内存中的存储方式...
C语言指针实现字符串的反转 本文主要讨论了使用C语言指针实现字符串的反转的方法,并提供了两个不同的实现程序。 标题解释 "C语言指针实现字符串的反转"这个标题表明本文的主要内容是使用C语言中的指针来实现字符...
c语言指针完整教程 指针不会用 不敢用 你敢说自己会C吗
在C语言中,指针是一个变量,它存储的是另一个变量的内存地址。当我们声明一个指针变量时,需要指定它所指向的数据类型,例如`int *p;`表示`p`是一个指向整型变量的指针。 接下来是指针的初始化。未初始化的指针...
"精选C语言指针资料大全"集合了多种资源,旨在帮助初学者和深入研究者更好地理解和掌握这一核心概念。以下是对这些资源中可能包含的知识点的详细解释。 1. **C指针宝典**: - 指针基础:理解指针是什么,如何声明...
C语言指针详解 C语言指针是一种关键的数据类型,想要学好C语言就必须掌握指针的用法。本篇文章将详细介绍C语言指针的基本概念、指针的声明和使用、数组指针的加减运算、指针之间的运算、指针之间的大小比较、数组...
在C语言中,指针是编程中的一个关键概念,它为程序员提供了对内存直接操作的能力,使得高效且灵活的编程成为可能。对于已经有一定C语言基础的学者来说,深入理解和熟练掌握指针的使用至关重要。本节将针对“C语言...
本教程《C语言指针详细讲解》深入探讨了指针的使用,包括指针与数组、指针与字符串以及指针与函数的交互。 首先,我们来看指针的概念。在C语言中,每当我们声明一个变量,系统就会在内存中为这个变量分配一块空间,...