我有一段代码,会给我一个字符数组。 我想将这个数组赋予一个需要字符指针的函数。 当我将此数组输入函数时,当我尝试运行程序时会导致分段错误。
这很好用。
char* buffer = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sum> <part>55</part> <part>6</part> <part>*</part></sum>";
long output = calcXML(buffer);
当我尝试制作一个数组时,它会给我一个分段错误
char buffer[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sum> <part>55</part> <part>6</part> <part>*</part></sum>";
long output = calcXML(buffer);
此外,当我尝试从数组中指出一个指针时,会发生相同的分段错误。
char buffer[] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><sum> <part>55</part> <part>6</part> <part>*</part></sum>";
char *ptrBuffer = malloc(strlen(buffer) * sizeof(char) + 1);
ptrBuffer = &buffer[0];
long output = calcXML(ptrBuffer);
我该如何解决这个问题?
编辑:
函数calcXML(char *xml)
会将xml参数传递给函数xmlParseDoc()
。这是libxml library
答案 0 :(得分:2)
malloc()
分配的内存超出本地数组的地址。不管它是否有用,但就像两个案例中的信息太少一样。此外,第三种情况下malloc()
调用本身不正确。
它将大小计算为strlen(buffer) * sizeof(char) + 1
,但由于终止字符也是一个字符,因此避免缩放分配是没有意义的。所以,它“应该”为(strlen(buffer) + 1) * sizeof(char)
。但是再次sizeof (char)
总是1,所以缩放完全没有意义,即它应该只是strlen(buffer) + 1
。同样,代码被破坏,因为malloc()
的返回值随后被立即覆盖,但仍然。
答案 1 :(得分:1)
没有周围的代码,很难说,但是由于版本2是合法的C语法,我认为你可能正在从一个函数返回这个数组,这意味着它会在函数退出后停止存在。取消引用指向它的指针很可能是段错误的。在第一种情况下不会发生这种情况,因为字符串文字是硬编码且不可变的,因此引用仍然有效。
使用第三种方法背后的想法实际上也是正确的,但是你做错了。您应该分配内存,然后将snprinft
,strncpy
或memcpy
与字符串文字结合使用,将字符串复制到缓冲区中。现在你丢弃指向malloced
内存的指针,这将导致泄漏。您将指针设置为自动分配的数组的开头,因此一旦超出范围,取消引用指向它的指针可能会再次出现段错误,原因与第2版相关。
答案 2 :(得分:1)
第一个代码将初始化buffer
以直接指向代码的text
段中的静态字符串。修改该字符串将是未定义的行为。
第二个代码将使用静态字符串的 copy 初始化buffer
,其中该副本驻留在堆栈上。当函数退出时,副本将消失。
第三个版本不起作用 - 你永远不会在分配的缓冲区中放入字符串的副本,然后你用在版本2中创建的相同的基于堆栈的副本覆盖该新指针。一个更简单的调用就是:
char *ptrBuffer = strdup(buffer);
不要忘记稍后free()
生成的副本。
至于为什么#2不起作用 - 鉴于提供的细节我们无法分辨。它取决于calcXML
实现中的某些内容,或者可能取决于您的问题中省略的代码。