使用sprintf来影响数组的内容,使用char *来影响另一个char数组

时间:2017-03-17 13:33:41

标签: c

我不是c程序员,我只知道基础知识。在我工作期间,我不得不处理别人的c代码。当我运行它时,此代码会出现分段错误。我使用gdb来调试它,结果发现错误的原因是使用" sprintf"。 这是解释问题的代码的一部分:

    char* ptr
    char str0 [1000]
    char str1 [1000]
    .
    .
    .
    sprintf(str1," some text %s some other text %s ",ptr+1,str0);

我知道有一个溢出,但我不知道sprintf是如何工作的,或者如何中继第二个数组(str0)以满足第一个大小。

非常感谢

2 个答案:

答案 0 :(得分:1)

您应该更改代码以使用snprintf(),这需要额外的参数并进行检查,以便格式化的字符串不会溢出缓冲区:

snprintf(str1, sizeof str1, " some text %s some other text %s ",ptr+1,str0);

这与指针添加无关,这只是跳过字符ptr1指向的第一个字符的一种方法。

答案 1 :(得分:0)

可能有两个原因。

  1. ptr未指向有效内存,因为您尚未在代码段中显示它的初始化
  2. sprintf与printf类似,但将整个sting写入缓冲区而不是控制台。在这里你要写一个str1字符串,根据声明可以容纳1000个字符。但是你写的字符串的长度是(字符串的长度由(ptr + 1)指出,我们不知道它的大小+ str0指向的字符串的长度,最多可以是1000 +在引号中你的文本需要更多的字符串)。很有可能你向str1写入超过1000个字符会导致分段错误。
相关问题