0

我想用这种形式“/dev/mixer:line”或“/dev/mixer:cd”从gtk_entry 设置混音器设备。

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

/dev/mixer:line

or:

/dev/mixer:cd

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

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() 之前释放具有赋值的字符是错误的

4

3 回答 3

1

free()只有当指针指向使用 分配的内存时,您才可以调用malloc()。在您的程序中,mixer_device最初指向一个文字字符串,因此调用free()会导致未定义的行为。

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

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

所以释放它总是安全的。

于 2013-07-29T17:12:34.820 回答
0

用 NULL 初始化;

char *mixer_device = NULL;

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

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

最后main(),进行决赛

free(mixer_device);
于 2013-07-30T02:34:42.927 回答
0

您在此处设置初始值:

char *mixer_device = "/dev/mixer";

它现在指向一个字符串文字,因此如果您尝试调用freeonmixer_device您将拥有undefined behavior,free只能在动态分配的内存(即 frommalloc等)上调用strdup...一种解决方案是用于strdup初始化您的变量:

mixer_device = strdup("/dev/mixer") ;
于 2013-07-29T17:13:49.730 回答