初始化char指针--赋值和strcpy() 本质区别【转】
原文地址:http://hi.baidu.com/todaygoodhj/item/0500b341bf2832e3bdf45180
使用常量字符串初始化char指针,或者使用strcpy复制,从语法上我觉得都是可以的。但是,在这个例子中选择了后者,我觉得是有其他考虑的。
因为,ctermid_name是全局的,可能用来传送数据,将str指向这个地址,可能会和其他的函数同步一个内存变量;而使用常量初始化:str="/dev/tty",那么系统会分配地址,这样str的地址是随机的。
个人认为区别在于这里。
“str="/dev/tty",那么系统会分配地址,这样str的地址是随机的。”
系统没有分配地址,str的数值是固定的。就和全局ctermid_name是固定的一样。因为"/dev/tty"是固定地址。
在看APUE时遇到一个问题,问题如下:
#include <stdio.h>
#include <string.h>
static char ctermid_name[L_ctermid];
char *
ctermid(char *str)
{
if (str == NULL)
str = ctermid_name;
return(strcpy(str, "/dev/tty")); /* strcpy() returns str */
}
在这个函数里,为啥用strcpy给指针赋值,而不直接赋值呢?
用以下简图来说明楼主的问题,直接赋值和拷贝是不一样的且为什么用拷贝而不用直接赋值.
strcpy(str."/dev/tty")
______________
str-------->|__|__|__|__|__|
^
|copy过去 覆盖原有内容.
________|_____
|/dev/tty\0 |
----------------
str="/dev/tty"
____________
str<------|/dev/tty\0 | 只把字符指针传给str,而str指的原来区域的内容未改变.引起的可能后果就
---------------
是原来str指向的那块内存丢失,内存泄漏
初始化char指针--赋值和strcpy() 本质区别【转】的更多相关文章
- char *直接赋值和strcpy之间什么区别
赋值是两个指针指向同一个位置. 而strcpy则是把内容拷贝了一份给另个一指针.
- char[]数组与char *指针的区别
char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...
- 关于JAVA中string直接初始化赋值和new的区别,是否可以联系到int[]的情况
String str1 = "ABC"; String str2 = new String("ABC"); String str1 = “ABC”;可能创建一个 ...
- c字符指针与字符数组的区别
1.定义 char *pchar; //定义了指针,没赋值之前不能使用.如果:printf("*pchar:%c\n",*pchar); 出现段错误Segmentation fa ...
- sizeof与strcpy的区别
转自:http://c.biancheng.net/view/342.html 表面上看strcpy和sizeof都是求字符串的长度,但是二者却存在着许多不同之处及本质区别 strlen是一个函数,用 ...
- VS2008 Debug与Release的本质区别(转)
如何设置:工具栏“生成”→“配置管理器”→“活动解决方案配置” 对于VS2008的初次使用者来说,常会遇到的编译问题时,Debug版本运行正常,但在Release版本则不稳定或无法运行.以下是对Deb ...
- 多线程第一次亲密接触 CreateThread与_beginthreadex本质区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beg ...
- strncpy 和 strcpy的区别 (要抽时间重点看,未完待续)
strcpy的实现: //GNU-C中的实现(节选): */ char* strcpy(char *d, const char *s) { char *r=d; while((*d++=*s++)); ...
- Debug 和 Release 编译方式的本质区别
一.Debug 和 Release 编译方式的本质区别 Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程 ...
随机推荐
- Hibernate入门案例 增删改
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Linux学习笔记(12)用户和用户组管理
越是对服务器安全性要求高的服务器,越需要建立合理的用户权限等级制度和服务器操作规范.在Linux中主要是通过用户配置文件来查看和修改用户信息. 1 用户信息文件 (1)用户信息文件/etc/passw ...
- 【maven 报错】maven项目执行maven install时报错Error assembling WAR: webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
在使用maven新建的web项目中,执行 执行如上的这两个操作,报错: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-co ...
- svn代码提交注意事项
先全部add,查看是否有gen和bin,然后再忽略这两个,忽略时选择最后rescury....
- 如何通过java代码对kylin进行cube build
通常是用于增量 代码如下: package com.dlht.kylinDemo; import java.io.BufferedReader; import java.io.FileNotFound ...
- 《DSP using MATLAB》为什么要z变换?
书中截图
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- Python: 常用list, string处理功能
#1. keep strings in double quote as one word when split string to words #e.g. str = ‘a b "is si ...
- XIII Open Cup named after E.V. Pankratiev. GP of Saratov
A. Box Game 注意到局面总数不超过$50000$,而且每次操作都会改变石子的奇偶性,因此按奇偶可以将状态建成二分图,然后求出最大匹配. 如果状态数是偶数,那么先手必胜,策略就是每次走匹配边, ...
- Web App开发入门
WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...