调用strdup()之前带有赋值的free()char

时间:2013-07-29 17:06:15

标签: c free strdup

我想用gtk_entry设置混音器设备,格式为“/ dev / mixer:line”或“/ dev / mixer:cd”。

用户必须输入此格式的混音器设备设置:

/dev/mixer:line

or:

/dev/mixer:cd

为此,我编写代码来设置混音器,并且与strdup()函数有相同的困境。 在调用strdup()之前使用赋值的free()char是错误的吗?

char *mixer_device = "/dev/mixer";
int mixer_channel = SOUND_MIXER_LINE;
int fd = -1;

int get_volume( void )
{
    int v, cmd, devs;
    int curvol = 0;

    if( fd < 0 ) fd = open( mixer_device, O_RDONLY );
    if( fd != -1 ) {

            ioctl( fd, SOUND_MIXER_READ_DEVMASK, &devs );
            if( devs & mixer_dev_mask ) {
                    cmd = MIXER_READ( mixer_channel );
            } else {
                    return curvol;
            }

            ioctl( fd, cmd, &v );
            curvol = ( v & 0xFF00 ) >> 8;
    }

    return curvol;
}

char *core_devnames[] = SOUND_DEVICE_NAMES;

int set_device( const char *devname )
{
    const char *channame;
    int i;

    /* if (mixer_device) free (mixer_device) <-- It is wrong ??? */ 
    mixer_device = strdup( devname );
    if( !mixer_device ) return -1;

    i = strcspn( mixer_device, ":" );
    if( i == strlen( mixer_device ) ) {
            channame = "line";
    } else {
            mixer_device[ i ] = 0;
            channame = mixer_device + i + 1;
    }
    fd = open( mixer_device, O_RDONLY );
    if( fd == 0 ) {
            fprintf( stderr, "mixer: Can't open device %s, "
                     "mixer volume and mute unavailable.\n", mixer_device );
            return -1;
    }

    return 0;
}

在调用strdup()

之前,使用赋值的free()char是错误的

3 个答案:

答案 0 :(得分:1)

如果指针指向分配有free()的内存,则只能调用malloc()。在您的程序中,mixer_device最初指向文字字符串,因此调用free()会导致未定义的行为。

不需要检查mixer_device是否为null,而是需要另一个变量来跟踪它是指向初始文字字符串还是使用strdup()创建的新字符串。或者,不是将其指向文字字符串,而是启动代码可以执行:

mixer_string = strdup("/dev/mixer");

所以释放它总是安全的。

答案 1 :(得分:0)

您可以在此处设置初始值:

char *mixer_device = "/dev/mixer";

现在指向字符串文字,因此如果您尝试在free上调用mixer_device,您将undefined behaviorfree只能在动态分配的内存上调用,即来自mallocstrdup等......一种解决方案是使用strdup来初始化变量:

mixer_device = strdup("/dev/mixer") ;

答案 2 :(得分:0)

使用NULL初始化;

char *mixer_device = NULL;

free(mixer_device)的值为NULL或当然是通过mixer_device分配的值时,可以使用malloc(), strdup(), realloc()。 wHEN null,没有任何东西被释放,也没有UB。然后,当您想要分配mixer_device时,只需

free(mixer_device);
mixer_device = strdup(NewName);

在结束main(),执行最后的

free(mixer_device);