c语言 - 免费不免费作为va_arg列表发送的指针



我想用下面的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),它确实会崩溃。

仅仅因为代码可以崩溃并不意味着它会崩溃。

相关内容

  • 没有找到相关文章

最新更新