cpp一些指针错误的用法

⌚Time: 2023-07-12 22:08:04

👨‍💻Author: Jack Ge

本人在指针犯过的错误

错误一 取函数返回值地址


int ret_int(){

    int a = 3;

    return a;

}



int main(){

    int *p = &ret_int();//错误,不能获取临时值的地址

    return 0;

}

正确的一


int ret_int(){

    int a = 3;

    return a;

}



int main(){

    int value = ret_int();  // 创建一个变量保存临时值

    int *p = &value;        //获取变量地址

    return 0;

}


正确的二


int ret_int(){

    int a = 3;

        return a;

}



int main(){

    int *p = new int;

        *p = ret_int();

        ...

    delete(p);

        return 0;

}

错误二 在局部作用域内取变量地址


int *p;

    {

        int a = 4;

        p = &a;   

    }

//a是一个局部变量,在作用域结束后被释放,因此p取a的地址,会成为空指针

错误三 函数返回本地变量地址


int *ret_int_point(){

    int a = 3;//错误,变量a在函数结束后被释放

    return &a;

}

int main(){



    int *p = ret_int_point();

    return 0;

}

正确的办法:使用动态内存分配变量空间,并手动释放空间


#include <stdlib.h>

int *ret_int_point(){

    int *a = (int*)malloc(sizeof(int));

    return a;

}

int main(){



    int *p = ret_int_point();

    ...

    free(p);

    return 0;

}

错误四 修改形参指针地址


void MemAllocate(char *arg){

    arg = (char *)malloc(sizeof(char));

}

int main(){

    char *p = NULL;

    MemAllocate(p);

    *p = 'x';//此处崩溃

    return 0;

}

函数分配内存并不能成功。分配空间时,所改变的是形参指针指向的地址空间,而并不能改变实参指针的内容,如果想改变实参,需要使用二级指针。

正确的写法应该是


void MemAllocate(char **arg){

    *arg = (char *)malloc(sizeof(char));//arg指向实参地址,达到修改实参的目的

}

int main(){

    char *p;

    MemAllocate(&p);

    *p = 'x';

    return 0;

}

归根结底,函数只能修改形参,只不过使用指针达到修改实参的目的。

错误五 返回局部变量储存的字符串


char* get_info(){

    char info[] = "abc";

    return info;

}

这个函数返回的是指向栈上局部变量的指针,这在函数返回后栈空间释放,将会导致未定义的行为,正确的办法是使用动态分配内存


char* get_info(){

    char* info= new char[4];

    strcpy(info, "abv");

    return info;

}

...

char* str = get_info();

cout << str << endl;

//手动释放

delete[] str;

 

或者将结果返回给参数


void get_info(char *arg){

    strcpy(arg, "abv");

}



...

char str[5] = {0};

get_info(str);

cout<<str;