我想用下面的freeS宏释放一个变量指针列表:freeS(s1,s2,...);
尽管从freeSF函数获取了第一个指针地址的打印,但我的代码并没有释放第一个指针。 在主要的,免费(s1)工作,但它应该。正如预期的那样在主要崩溃中自由(s2)。
如何释放freeSF函数中的s1指针?
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#define freeS(...) freeSF("", __VA_ARGS__, NULL)
void freeSF(char *paramType, ...) {
va_list pl;
va_start(pl, paramType);
paramType = va_arg(pl, char *);
while (paramType) {
printf("arg %p\n", paramType);
free(paramType);
paramType = va_arg(pl, char *);
}
va_end(pl);
}
int main(int ARGC, char** ARGV) {
char *s1 = strdup("1");
char *s2 = strdup("2");
printf("s1 %p, s2 %p\n", s1, s2);
freeS(s1, s2);
free(s1);
}
答案 0 :(得分:6)
您的计划展示undefined behavior,因为您可以双倍释放。
对于未定义的行为,任何事情都可能发生。您的程序可能会崩溃,它可能会输出奇怪的结果,或(在这种情况下)它可能似乎正常工作。添加看似无关的更改(例如调用printf
或添加未使用的局部变量)可能会改变未定义行为的显示方式。
在这种情况下,在free(s1)
中调用main
并不会导致崩溃。它仍然是未定义的行为。例如,当我运行此代码时,它不会崩溃。但是,如果我在调用malloc
之前添加了对free(s1)
的调用,它就会崩溃。
仅仅因为代码可以崩溃并不代表 。