遇到一个很奇怪的问题。 请教什么原因?
是这样的。 那个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;
}