很简单的情况。
我有一个指向struct的指针,我想填充它的值。
在一个地方它起作用了:
janus_audiobridge_sync_endpoint_response *response = g_malloc0(sizeof(janus_audiobridge_sync_endpoint_response));
response->error_code = JANUS_AUDIOBRIDGE_ERROR_UNKNOWN_ERROR;
g_snprintf(response->error_cause, 512, "%s - %s", "Failed to find about page with locale - ", locale_text);
return response;
然而,当我基本上用另一种方法做同样的事情时,
response
结果是response->error_cause
:janus_audiobridge_sync_endpoint_response *response = g_malloc0(sizeof(janus_audiobridge_sync_endpoint_response));
response->error_code = 0;
response->error_code = JANUS_AUDIOBRIDGE_ERROR_UNAUTHORIZED;
g_snprintf(response->error_cause, 512, "You need to pass a valid user_secret, before you continue.");
goto plugin_response;
我的问题是:为什么它在一种情况下工作而不是在另一种情况下?在C语言中,做这种事情的最佳实践是什么?
谢谢!
编辑:更奇怪的是,当我这么做的时候:
response->error_cause = "You need to pass a valid user_secret, before you continue.";
它在第二个例子中起作用,为什么?
编辑:
按要求:
typedef struct janus_audiobridge_sync_endpoint_response {
gint error_code;
gchar *error_cause;
json_t *message;
} janus_audiobridge_sync_endpoint_response;
最佳答案
从声明中可以清楚地看出error_cause
只是一个指针,而不是数组。
因此,当您分配(并清除)janus_audiobridge_sync_endpoint_response
的实例时,它不会指向任何有效的对象。这样你就得到了未定义的行为。
要解决这个问题,需要为字符串分配空间。在glib land中,您可以使用niceg_strdup_printf()
函数执行以下操作:
response->error_cause = g_strdup_printf("%s - %s", "Failed to find about page with locale - ", "foo", locale_text);
注意,我在那个调用中添加了一个
foo
,考虑到格式字符串,您的原始代码似乎无法提供适当数量的参数,这(再次!)给你未定义的行为。执行例如
error_cause = "hello";
的操作总是有点安全的,因为这只是将结构中的指针设置为指向内存中某个静态数组,它不会复制任何字符。唯一的风险是,由于结构中的指针不是const
,可能有人试图修改字符串,这会再次导致未定义的行为。关于c - C-g_snprintf在一种情况下有效,但在另一种情况下无效,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43367597/