我想用下面的freeS宏释放一个指针的变量列表:freeS(s1,s2,...);
我的代码不会释放第一个指针,尽管从 freeSF 函数获得了第一个指针地址的打印。总的来说,free(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 %pn", 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 %pn", s1, s2);
freeS(s1, s2);
free(s1);
}
您的程序表现出未定义的行为,因为您是双重释放。
对于未定义的行为,任何事情都可能发生。 您的程序可能会崩溃,可能会输出奇怪的结果,或者(在这种情况下)它看起来可以正常工作。 添加看似不相关的更改(例如调用printf
或添加未使用的局部变量)可以更改未定义行为的表现方式。
在这种情况下,在 main
中调用free(s1)
不会导致崩溃。 它仍然是未定义的行为。 例如,当我运行此代码时,它不会崩溃。 但是如果我在调用malloc
之前添加一个调用free(s1)
,它确实会崩溃。
仅仅因为代码可以崩溃并不意味着它会崩溃。