【发布时间】:2021-03-26 22:55:00
【问题描述】:
我有一个奇怪的问题,我使用 malloc 分配了内存并返回了这个新分配的内存的地址。但是这个地址在return前后不一样(函数内外)。
这里是代码(只关心最后 3 行):
char* InfoFile_getValue(char* projectName, char* key)
{
char* returnValue = NULL;
char projectInfoPath[200];
sprintf(projectInfoPath,"projects/%s/info.txt",projectName);
FILE* fp = fopen(projectInfoPath,"r");
if (fp != NULL) {
char* ptr;
size_t len = 0;
char* lineFromFile = NULL;
while(getline(&lineFromFile, &len, fp)!=-1)
{
if (strstr(lineFromFile,key))
{
ptr = lineFromFile + strlen(key);
ptr = ptr + strspn(ptr, ": ");
returnValue = malloc(strlen(ptr)+1);
strcpy(returnValue,ptr);
break;
}
}
free(lineFromFile);
fclose(fp);
}
printf("Inside size: %d\n",sizeof(returnValue));
printf("String address inside function %p\n", returnValue);
return returnValue;
}
然后我调用这个函数:
char* baseString = InfoFile_getValue(projectName, "base");
printf("Outside size: %d\n",sizeof(baseString));
printf("String address outside function: %p\n",baseString);
printf("%s\n", baseString);
我使用 CC 和以下标志编译了这个:
pkg-config --cflags gtk+-3.0-Wno-incompatible-pointer-types -Wno-int-conversion -Wno-discarded-qualifierspkg-config --libs gtk+-3.0-lpthread -lm
它给出了以下结果:
Inside size: 8
String address inside function 0x5567d9ff4540
Outside size: 8
String address outside function: 0xffffffffd9ff4540
Naruszenie ochrony pamięci (zrzut pamięci)
看起来它将此地址削减为 4 个字节并在其前面加上 0xff,但我不知道为什么,我从未遇到过这样的问题。任何建议都会有所帮助。
【问题讨论】:
-
sizeof(returnValue)= pointer 的 sizeof,而不是它指向的内容。只是说。不知道这是否是意图,但无论如何,这就是你得到的。 -
是的,我想检查指针的大小以确保它到处都是 8 个字节。只是为了确保。
-
通常你只会在调用者没有为调用做适当的准备时看到这样的东西。即,它没有合适的原型,并假设
int返回,热情的警告-sqelchers 通过硬铸造它来“修复”它。在这种情况下,如果int和char*的大小不同(x64 平台的典型情况),则实际上只获得了 64 位结果中的 32 位;余数来自幻象int的msb。但我在这里看不到这样的恶作剧。使用原型,这段代码看起来很合适。如果您声称的内容属实,则应该使用InfoFile_getValue进行复制,大部分内容都会被毁掉。这是真的吗? -
谢谢大家,你们太快了!是的,我错过了正确的功能原型。 InfoFile_getValue 在单独的文件中,我忘记包含“infoFile.h”。我最终需要学会阅读警告或以某种方式将隐式声明警告视为错误。再次感谢,你太棒了!
-
嗯。你的编译器应该告诉你这是缺失的。如果没有,您需要调高警告级别:
-Wall -Wextra。当然,您需要注意警告。