指针 分配空间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了指针 分配空间相关的知识,希望对你有一定的参考价值。

char *p = NULL;
char *p1;
p1 = p;
p1 = (char*)malloc(100);
此时打印 p1的 地址是存在的,但是打印 p的地址依然是null。这是为啥呢?

char *p = NULL; //p=NULL
char *p1; //p1值未知
p1 = p; //p1=NULL,p=NULL
p1 = (char*)malloc(100); //p1=新建空间首地址,p=NULL
所以在这个程序中:第二行有一点危险,定义指针时一定要初始化,因为这样,你一旦不小心解引用了一个未被初始化的指针,就有可能会引发严重的问题,但如果对一个空指针进行解引用,仅仅是程序崩溃而已追问

void mymalloc(char *p)

p = (char *)malloc(100);

int main(void)

char *str = NULL;

mymalloc(str); //这里有BUG。
strcpy(str, "hello");
这个又如何理解呢、

追答

首先,你吧str指针当做参数传给了mymalloc(),只是进行了一个值的复制而已,所以,在函数体内部对p指针的任何修改均不会对str指针造成影响,你应该这样写:

void mymalloc(char **p)

    *p=malloc(sizeof(char) * 100);

int main()

    char *str=NULL;
    mymalloc(&str);
    strcpy(str,"hello");
    free(str);
    return 0;

另外,进行c/c++编程时,有一个规矩叫做:在哪里创建就在哪里释放。你的mymalloc()只有创建而没有释放,所以,这也有BUG。其实进行编程时,规范和习惯很重要,不要只以为通过了编译就完了。

参考技术A 1. 使用:p = q;(q指向一段空间)
- 这没有分配空间,只让p这个指针变量 = q
2. 使用:p = (char *)malloc(100*sizeof(char));
- 这是分配空间
char *p = NULL与char *p有区别么?
- 这给了指针变量p一个初始值0,方便检测错误指针
memset(p, 0, sizeof(p));
- 这不是初始化指针,是初始化指针指向的内存,sizeof(p)=4(32位平台),是错误的用法

“指针不能赋null值,如果初始化为null的话,指针就为空地址,指针将不能使用,就算在程序中重新给该指针赋值也没用了,因为指针指向了一块空的地址也可以理解为不存在的地址所以指针不能使用了。 ”

这是什么东西。。。错误

char *p = NULL 是个好习惯
例如:

char *p = NULL;
p = new char [256];
scanf("%s", p);
参考技术B 你第一句p不是给赋值成NULL了吗,之后也没变

对指针形参分配空间

GetMemory(char *p){
    p = (char*)malloc(100);
}
void Test(void){
  char *str = NULL;
  GetMemory(str);
  strcpy(str, "hello world");
  printf(str);
}

这段代码有错,str指针始终为空,因为GetMemory改变的是参数的值,而非指针指向的空间里的值,而改变形参的值并不会传回。

修改方法:

//方法一:函数返回
char* GetMemory(){
    char* p = (char*)molloc(100);
    return p;
}

//方法二:二级指针
void GetMemory(char **P){
    *p = (char*)molloc(sizeof(char)*100);
}

 

以上是关于指针 分配空间的主要内容,如果未能解决你的问题,请参考以下文章

对指针形参分配空间

150809112 杨磊

C++结构体指针数组如何分配空间,用new

我的改错日常----指针的使用

12354

JVM内存分配