如何在C中将char数组转换为char指针

时间:2014-10-28 12:01:53

标签: c arrays pointers

我有一段代码,会给我一个字符数组。 我想将这个数组赋予一个需要字符指针的函数。 当我将此数组输入函数时,当我尝试运行程序时会导致分段错误。

这很好用。

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

的功能

3 个答案:

答案 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语法,我认为你可能正在从一个函数返回这个数组,这意味着它会在函数退出后停止存在。取消引用指向它的指针很可能是段错误的。在第一种情况下不会发生这种情况,因为字符串文字是硬编码且不可变的,因此引用仍然有效。

使用第三种方法背后的想法实际上也是正确的,但是你做错了。您应该分配内存,然后将snprinftstrncpymemcpy与字符串文字结合使用,将字符串复制到缓冲区中。现在你丢弃指向malloced内存的指针,这将导致泄漏。您将指针设置为自动分配的数组的开头,因此一旦超出范围,取消引用指向它的指针可能会再次出现段错误,原因与第2版相关。

答案 2 :(得分:1)

第一个代码将初始化buffer以直接指向代码的text段中的静态字符串。修改该字符串将是未定义的行为。

第二个代码将使用静态字符串的 copy 初始化buffer,其中该副本驻留在堆栈上。当函数退出时,副本将消失。

第三个版本不起作用 - 你永远不会在分配的缓冲区中放入字符串的副本,然后你用在版本2中创建的相同的基于堆栈的副本覆盖该新指针。一个更简单的调用就是:

char *ptrBuffer = strdup(buffer);

不要忘记稍后free()生成的副本。

至于为什么#2不起作用 - 鉴于提供的细节我们无法分辨。它取决于calcXML实现中的某些内容,或者可能取决于您的问题中省略的代码。