如何使用C中的snprintf将字符串连接到结构中的void *

时间:2018-04-03 21:58:00

标签: c

我正在尝试使用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;
    }

2 个答案:

答案 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