一段时间前,我不得不使用mmc-utils的开源代码,并找到了以下函数:
int do_erase(int nargs, char **argv)
{
int dev_fd, ret;
char *print_str;
__u8 ext_csd[512], checkup_mask = 0;
__u32 arg, start, end;
...
if (strcmp(argv[1], "legacy") == 0) {
arg = 0x00000000;
print_str = "Legacy Erase";
} else if (strcmp(argv[1], "discard") == 0) {
arg = 0x00000003;
print_str = "Discard";
} else if (strcmp(argv[1], "secure-erase") == 0) {
print_str = "Secure Erase";
checkup_mask = EXT_CSD_SEC_ER_EN;
}
...
if ((checkup_mask & ext_csd[EXT_CSD_SEC_FEATURE_SUPPORT]) !=
checkup_mask) {
fprintf(stderr, "%s is not supported in %s\n",
print_str, argv[4]);
ret = -ENOTSUP;
goto out;
}
out:
printf(" %s %s!\n\n", print_str, ret ? "Failed" : "Succeed");
close(dev_fd);
return ret;
}
我不明白的是,在没有为print_str
分配任何内存的情况下,这个函数是如何工作的.当然,堆栈中准备的字符串有一个指针,但C语言在运行时没有神奇的编译器堆栈分配--有吗?
编译mmc-utils
运行得很好,之前我运行了几次代码,没有出现问题.有没有人能给我解释一下这里使用的神秘巫术?