C: правильный синтаксис для выделения памяти с помощью указателей на указатели - PullRequest
0 голосов
/ 06 июня 2010

Это мой первый пост здесь, надеюсь, я не буду дурачить себя.

Я пытаюсь использовать функцию для выделения памяти указателю, копирования текста в буфер и изменения символа. Я продолжаю получать ошибку и пытаюсь найти ответ, мой синтаксис, вероятно, неправильный, я мог бы использовать некоторое просветление.

/* 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 ]

2 голосов
/ 06 июня 2010

Ваша проблема просто одна из приоритетных. Оператор [] имеет более высокий приоритет, чем унарный - *, поэтому строка анализируется, как если бы она была:

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

... это не то, что вы хотите. Вы на самом деле хотите, чтобы * был первым, поэтому вам нужно использовать паразиты:

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

Кроме того, ваш strncpy() звонок неправильный. strncpy() не обнуляет результат, если количество скопированных символов равно длине; и поскольку ваша память исходит прямо из malloc(), там, возможно, уже нет нуль-терминатора. strncpy() на самом деле неправильный инструмент в 99,99% случаев, с которыми вы столкнетесь - поищите на этом сайте множество других ответов, объясняющих почему.

Вместо этого можно использовать вызов strncat():

(*Buffer)[0] = '\0';    /* Truncate to an empty string */
strncat(*Buffer, Text, 5);
1 голос
/ 06 июня 2010

Проблема в том, что *Buffer[2] означает *(Buffer[2]) - вы пытаетесь разыменовать неправильный указатель. Вы хотите использовать (*Buffer)[2].

1 голос
/ 06 июня 2010

*Buffer[2] интерпретируется как *(Buffer[2]). То, что вы хотите, это (*Buffer)[2].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...