我想用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是错误的答案 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 behavior
,free
只能在动态分配的内存上调用,即来自malloc
,strdup
等......一种解决方案是使用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);