C:使用指针指针分配内存的正确语法

时间:2010-06-06 04:57:37

标签: c

这是我第一次在这里发帖,希望我不会愚弄自己。

我正在尝试使用函数为指针分配内存,将文本复制到缓冲区,然后更改字符。我不断得到一个段错误,并试着查找答案,我的语法可能是错误的,我可以使用一些启示。

/* My objective is to pass a buffer to my Copy function, allocate room, and copy text to it.  Then I want to modify the text and print it.*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int Copy(char **Buffer, char *Text);

int main()
{
 char *Text = malloc(sizeof(char) * 100);
 char *Buffer;

 strncpy(Text, "1234567890\n", 100);

 Copy(&Buffer, Text);
}

int Copy(char **Buffer, char *Text)
{
 int count;

 count = strlen(Text)+1;

 *Buffer = malloc(sizeof(char) * count);

 strncpy(*Buffer, Text, 5);

 *Buffer[2] = 'A'; /* This results in a segfault.  "*Buffer[1] = 'A';" results in no differece in the output. */

 printf("%s\n", *Buffer);

}

3 个答案:

答案 0 :(得分:2)

你的问题只是一个优先事项。 []运算符具有更高的优先级,即一元 - *,因此该行的解析就像是:

*(Buffer[2]) = 'A';

......这不是你想要的。您实际上希望首先发生*,因此您需要使用parantheses:

(*Buffer)[2] = 'A';

此外,您的strncpy()电话错误。如果复制的字符数等于长度,则strncpy()不会终止结果;因为你的记忆直接来自malloc(),所以可能还没有一个nul-terminator。在您将遇到的99.99%的案例中,strncpy()实际上是错误的工具 - 在此网站上搜索解释原因的众多其他答案。

可以使用对strncat()的调用:

(*Buffer)[0] = '\0';    /* Truncate to an empty string */
strncat(*Buffer, Text, 5);

答案 1 :(得分:1)

*Buffer[2]被解释为*(Buffer[2])。你想要的是(*Buffer)[2]

答案 2 :(得分:1)

问题是*Buffer[2]表示*(Buffer[2]) - 你试图取消引用错误的指针。您想使用(*Buffer)[2]