【发布时间】:2021-10-23 00:58:45
【问题描述】:
我正在尝试获取机器的 UUID,但此代码得到错误的结果。
const char* getUUID() {
char ret[512];
io_registry_entry_t ioRegistryRoot = IORegistryEntryFromPath(kIOMasterPortDefault, "IOService:/");
CFStringRef uuidCf = (CFStringRef) IORegistryEntryCreateCFProperty(ioRegistryRoot, CFSTR(kIOPlatformUUIDKey), kCFAllocatorDefault, 0);
IOObjectRelease(ioRegistryRoot);
CFStringGetCString(uuidCf, ret, sizeof(ret)*sizeof(char), kCFStringEncodingUTF8);
CFRelease(uuidCf);
NSLog(@"getUUID1: %s", ret);
return ret;
}
const char* getCPU() {
char ret[255];
strcpy(ret, "");
NSLog(@"getUUID2: %s", getUUID());
strcat(ret, getUUID());
NSLog(@"ret: %s", ret);
return ret;
}
返回这个结果:
getUUID1: 72B5E603-C915-52A7-K7C8-3E2N5214D18B - 好
getUUID2: 72B5E60 - 错误
getUUID1: 72B5E603-C915-52A7-K7C8-3E2N5214D18B - 好
ret: !è`? - 完全错误
我哪里错了?
【问题讨论】:
-
您正在返回一个指向局部变量的指针 (ret[512])。这是无效的。 stackoverflow.com/questions/19042552/… 也看看这个:stackoverflow.com/questions/1042940/… 特别是 std::vector 用作缓冲区的部分
-
返回分配在堆栈上的数据是 C++ 中的 #1 内存管理错误。大多数编译器都会对此发出警告。 Xcode 也是如此。你有没有看到警告说“返回的与局部变量'ret'相关的堆栈内存地址”?