gpt4 book ai didi

c - 在调用 strdup() 之前使用 free() 分配值的 char

转载 作者:行者123 更新时间:2023-11-30 15:46:51 24 4
gpt4 key购买 nike

我想从 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()之前对已赋值的char进行free()是错误的

最佳答案

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

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

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

所以释放它总是安全的。

关于c - 在调用 strdup() 之前使用 free() 分配值的 char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17929983/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com