今天重新拿起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语言中一个非常重要的概念,但它却是初学者最容易迷惑和混淆的部分。要真正搞定C语言指针,需要深入理解C语言变量的存储实质和内存空间的概念。 1. 变量的存储实质 内存空间可以看作是一个存放数据的...
C语言指针函数和函数指针详细介绍 C语言中指针函数和函数指针是两个不同的概念,但它们之间存在着紧密的联系。本文将对C语言中的指针函数和函数指针进行详细的介绍。 一、指针函数 指针函数是指返回值为指针的...
【C语言指针课程PPT】讲解了C语言中核心的指针概念,它是C语言高效编程的关键。指针允许程序直接访问内存地址,增强了代码的灵活性和性能。以下是关于指针的详细知识点: 1. **变量与内存地址**: - 当在C语言中...
C语言指针题库 本资源摘要信息是关于C语言指针的题库,涵盖了计算机等级二级考试中的相关内容。该资源包含选择题和编程题,旨在帮助考生和学习者提高C语言指针的知识和技能。 指针基本概念 在C语言中,指针是一种...
《指针详解——C语言指针完全解析》 在C语言的世界中,指针是一个强大的工具,也是理解和掌握C语言的关键。本文将深入探讨指针的概念、类型、运算及其在笔试中的重要性。 首先,我们要了解什么是指针。指针是一个...
本篇文章将深入探讨C语言指针的各个方面。 首先,我们需要了解指针的声明方式。在声明指针时,我们会指定指针所指向的数据类型。例如: 1. `int *p;` 这里,`p`是一个指针,它指向一个`int`类型的变量。`*`表示...
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语言指针的基本概念、指针的声明和使用、数组指针的加减运算、指针之间的运算、指针之间的大小比较、数组...