MA35D1 地址指针有ffff在前面会死机

cwlin0 |浏览90次
收藏|2023/12/22 13:36

遇到一个很奇怪的问题。 请教什么原因?

是这样的。 那个char* 地址回出去时多了ffff在前面导致死机。

================File 1================================

char globalStringValue[] ="abc";


char* getString()

{

        char* strResp = globalStringValue;

        printf("array-address= %p\n", strResp); //-->0xffffd91d2a88

        return strResp;

}


================File 2================================


void main()

{

        char* strValue = getString();

        printf("return-value-address= %p\n", strValue); //--> 0xffffffffd91d2a88

        printf("value-string= %s\n", strValue); //--> Segmentation Fault

        return;

}


=====================================================

Run:

array-address = 0xffffd91d2a88

return-value-address= 0xffffffffd91d2a88

Segmentation Fault


满意回答

2023/12/22 13:44

代码有可能存在隐患:


1.globalStringValue定义为一个全局数组,该数组在程序运行期间可能在内存中移动,因此getString()返回的指针可能指向错误的地址。


2.strResp指向的地址是globalStringValue数组的第一个元素地址,但由于数组名不是指针,打印出来的 addresses可能不完全一致。


3.如果在程序运行期间,内存管理系统对globalStringValue数组所在内存区域进行重新分配,那么之前返回的指针就失效了。


4.嵌入式系统资源有限,可能发生内存碎片,全局变量的地址不能保证一直有效。


所以对于嵌入式Linux系统,返回全局变量地址作为字符串是不安全的,需要返回字符串拷贝。


参照以下操作,这样会更合理:


1.globalStringValue定义为static,保证它不会被调整地址。

2.返回指针时做内存拷贝,返回新的字符串拷贝。

3.使用const修饰返回值,防止被修改内容。



static const char globalStringValue[] ="abc";


char* getString()

{

    char* strResp = NULL;


    strResp = (char*)malloc(strlen(globalStringValue) + 1);

    if (strResp == NULL) {

        return NULL;

    }


    printf("array-address= %p\n", strResp);

  

    memset(strResp, 0, strlen(globalStringValue) + 1);


    strcpy(strResp, globalStringValue);


    return strResp;

}


int main()

{

    char* strValue = getString();

    if (strValue != NULL) {

        printf("return-value-address= %p\n", strValue);

        printf("value-string= %s\n", strValue);

        free(strValue);

    }

    return 0;

}


nuvoton2022

其他回答(0)
0人关注该问题
+1
 加载中...