我正在尝试使用snprintf将字符串连接到void *但我得到了分段错误。
typedef struct __buf{
void* ptr;
size_t len;
}
buf val = {NULL, 100};
int main(){
snprintf(val->ptr, val->len, "%s%s", "hello", "world");
return 0;
}
答案 0 :(得分:2)
通过
buf val = {NULL, 100};
val.ptr
指向NULL
,当然snprintf
将失败。你需要
为它分配内存:
int main(void)
{
val.ptr = calloc(val.len, 1);
if(val.ptr == NULL)
{
fprintf(stderr, "not enough memory\n");
return 1;
}
snprintf(val->ptr, val->len, "%s%s", "hello", "world");
free(val.ptr);
return 0;
}
请注意
val->ptr = (void *)(strcat("hello","world"));
非常错误。 strcat
的第一个参数不能是指向字符串的指针
literal,因为修改字符串文字会产生未定义的行为,并且在大多数系统中,字符串文字存储在只读内存中。
您需要一个可以修改数组中字符的数组:
char str[20] = "hello";
strcat(str, "world");
答案 1 :(得分:1)
如何使用C
中的snprintf将字符串连接到结构中的void *
以下内容与snprintf(NULL, 100, "%s%s", "hello", "world");
类似,它会尝试将数据写入NULL
- 未定义的行为。
buf val = {NULL, 100};
snprintf(val->ptr, val->len, "%s%s", "hello", "world");
而是分配@Pablo
所述的数据要确定所需的内存,代码可以使用snprintf()
的返回值,并且首先传递0。
snprintf
函数返回在n
足够大的情况下写入的字符数,不计算终止空字符,如果发生编码错误则返回负值。 C11dr§7.21.6.53
int len = snprintf(NULL, 0, "%s%s", "hello", "world");
if (len >= 0 && (val->ptr = malloc(len + 1u)) != NULL) {
val->len = len + 1u;
snprintf(val->ptr, 0, "%s%s", "hello", "world");
}
....
// Later free the memory.
free(val->ptr);
val->ptr = NULL;
val->len = 0;
BTW,建议在size
中使用struct __buf
是要保存缓冲区的 size 。