C字符串指针操作

下面是我自己的见解,不具有权威性,如果哪位大神发现错误还请指出以共同进步。

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操作的第一个变量的地址值必须指向堆空间才可以,不知道对不对。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值