下面是我自己的见解,不具有权威性,如果哪位大神发现错误还请指出以共同进步。
int main(int argc,char*argv[]){
char *temp;
temp="King";
printf("temp address is %d\n",temp);//此处temp的内存地址应该指向栈空间的地址。此时未给temp分配堆内存,如果调用srncpy(temp,"abc",4);则会出错,我估计是因为strncpy函数是给分配堆空间的变量赋值的函数,但我们尚未给temp使用malloc或calloc函数分配内存空间。
printf("temp is %s\n",temp);
char *tempStr="A Hi Android";
printf("tempStr address is %d\n",tempStr);
temp=(char*)malloc(sizeof(char)*0);
printf("temp address is %d\n",temp);
strncpy(temp,"Hi",strlen("Hi Android")+1);//在上面我们给temp分配了堆内存空间,虽然我们分配了0个字节的空间,但此时temp的地址值已经指向堆空间,所以我们调用strncpy函数不会出错,并且此时若输出temp的值,就是我们调用函数strncpy所赋的值“Hi”。
free(temp);
printf("after free temp is %s\n",temp);//此处输出的地址值同未调用free函数之前的地址相同,free(temp)操作的结果是:指针temp指向的地址没变,但地址处的数据此时已经无定义了。即,指针还在,但是数据已经被释放了。
strncpy(temp,"abc",4);//此处仍会成功执行,因为free未使得temp的地址指针改变,temp地址的指针值依然指向堆空间,但此时的空间值可以再次被申请,所以最好在free一个变量的空间后,将变量的指针赋值为NULL。否则如果后面有类似于这样的语句char* tempStr;tempStr=(char*)malloc(sizeof(char)*16);strncpy(tempStr,"zhao",5);printf("tempStr is %s temp is %s",tempStr,temp );temp的值就变成了"zhao"不再是上面的“abc”。
}
注解:我原以为strncpy函数的第一个变量的地址值不是NULL就可以使用,但当我改变了temp的地值之后仍然不能使用,我就想可能是因为strncpy操作的第一个变量的地址值必须指向堆空间才可以,不知道对不对。
分享到:
相关推荐
C语言中没有特定的字符串类型,我们通常是将字符串放在一个字符数组中,这在《C语言字符数组和字符串》中已经进行了详细讲解,这里不妨再来演示一下: #include int main(){ char str[] = ...
自定义函数实现 C-字符串基本操作 交换 C-字符串 C-字符串数组排序
这是针对不知道字符串大小并且不占用额外空间的做法,需要非常繁琐的操作,要加很多标记,越界判断也会有些麻烦(结合优势么,用字符串常量而不是栈空间中的字符数组,有'\0'——就好判断了!) (关于空间的占用,...
有用户输入的两个字符串a和b,两字符串中有字母和数字,请完成如下两个操作, 1. 编写一个函数strConCat,将字符串a和字符串b连结成字符串c,并返回给主函数; 2. 对连接后的字符串c,将其中连续的数字作为一个整数...
生成一副扑克牌,这副扑克牌具有52张,4种不同的花色,可以对这副新的扑克牌进行洗牌、发牌的操作
C_结构与指针互相操作,结构与byte数组,所有字符串详解
string是STL里的标准类,习惯了使用指针操作C的char *字符串,刚开始并不是很适应,主要原因是对string.h里的函数没有找到合适的C++替换方法,因此,对常用的sring.h里的函数替换说明如下: strcpy: str.substr() ...
字符串输入数据格式类型(%格式操作符号) %% 百分号标记#就是输出一个% %c 字符及其ASCII码 %s 字符串 %d 有符号整数(十进制) %u 无符号整数(十进制) %o 无符号整数(八进制) %x 无符号整数(十六进制) ...
定义一个新的与传递过来字符串长度 相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转*//*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回...
所有的字符串类都起源于C语言的字符串,而C语言字符串则是字符的数组。C语言中是没有字符串的,只有字符数组。 谈一下C++的字符串:C++提供两种字符串的表示...操作字符串的时候只要操作指针就可以了。如 : const ch
精心整理,大家在使用VC++处理字符串的时候肯定遇到unicode 宽字符的问题: 比如:“不能将参数 1 从“const char [5]”转换为“LPCTSTR””之类的问题。 在此文档中告诉你怎么转换。 cstring 转换 char cstring ...
平时对字符串的操作的是很多的,了解下常用的字符串函数会使 c 编程变得很快捷!这里适当整理一下,方便以后参考。使用时,会用到大量指针的操作,注意加头文件: #include 一、str 系列 1.strtok ...
在LINUX系统下,并没有合适的INI文件读取函数。fearhacker因为工作需要写...该程序利用C语言编码,主要采用到的技术知识有,二维数组,二维数组指针,结构体,字符串指针,强制类型转换,动态内存的开辟、使用、销毁。
本书从介绍内存和实时内存概念开始,然后讲述了指针变量的概念和它最重要的操作(引用和解引用)、指针运算和一维数组、使用指针处理字符串、指针访问多维数组的用法、使用指针访问结构体与成员字段、函数指针概念的...
1、对照系统函数的源码,字符串操作函数的标准答案; 2、介绍万能指针变量(void*类型)的使用规则; 3、介绍C语言中的两大族函数:mem族函数与str族函。
全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答...
字符串的操作演示实例源码,比如对字符串进行连接,字符串比较,从字符串中存取字符,如何计算一个字符串的大小,如何使用VC快速格式化一个字符串,如何将Cstring类型的字符串转换成int型和float型,如何让字符串...
使用思维导图xmind工具整理的C和指针知识点,其中包括基本概念、数据、操作符、指针、函数、数组、字符串、结构体和联合、动态内存分配、预处理器、输入输出函数、标准库函数、经典抽象数据类型等知识点!
1. 数组和字符串 2. 函数参数传递 3. 动态内存分配和释放 4. 结构体和链表操作 在C语言中,我们可以使用malloc、calloc和realloc等函数来动态分配内存空间。这些函数返回一个指向分配内存空间起始位置的指针,我们...
本书从介绍内存和实时内存概念开始,然后讲述了指针变量的概念和它重要的操作(引用和解引用)、指针运算和一维数组、使用指针处理字符串、指针访问多维数组的用法、使用指针访问结构体与成员字段、函数指针概念的...