这是我第一次在这里发帖,希望我不会愚弄自己。
我正在尝试使用函数为指针分配内存,将文本复制到缓冲区,然后更改字符。我不断得到一个段错误,并试着查找答案,我的语法可能是错误的,我可以使用一些启示。
/* 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);
}
答案 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]
。