Я работаю над программой для класса C, и я достиг точки, где я не знаю, что делать. Мы реализуем тип библиотеки String.Непоследовательность c указателей
У меня есть заголовочный файл (MyString.h)
typedef struct {
char *buffer;
int length;
int maxLength;
} String;
String *newString(const char *str);
В файле реализации функций (MyString.c)
#include <stdlib.h>
#include <stdio.h>
#include "MyString.h"
String *newString(const char *str) {
// Allocate memory for the String
String *newStr = (String*)malloc(sizeof(String));
if (newStr == NULL) {
printf("ERROR: Out of memory\n");
return NULL;
}
// Count the number of characters
int count;
for (count = 0; *(str + count) != '\0'; count++);
count++;
// Allocate memory for the buffer
newStr->buffer = (char*)malloc(count * sizeof(char));
if (newStr->buffer == NULL) {
printf("ERROR: Out of memory\n");
return NULL;
}
// Copy into the buffer
while (*str != '\0')
*(newStr->buffer++) = *(str++);
*(++newStr->buffer) = '\0';
// Set the length and maximum length
newStr->length = count;
newStr->maxLength = count;
printf("newStr->buffer: %p\n",newStr->buffer); // For testing purposes
return newStr;
}
И тестер (main.c)
#include <stdio.h>
#include "MyString.h"
main() {
char str[] = "Test character array";
String *testString = newString(str);
printf("testString->buffer: %p\n",testString->buffer); // Testing only
}
Проблема в том, что, хотя testString указывает на String, созданный в newString(), их буферы указывают на разное запоминание y адресов. Почему это?
Заранее спасибо
Это подействовало. Большое спасибо! – fpele
Как было предложено другими ответами, я также рассмотрел бы использование strcpy вместо ручного копирования строки тоже :) – Saul
@fpele Кроме того, '* (++ pBuffer) = '\ 0';' должен быть '* pBuffer = '\ 0' ; '. Когда копирование 'while' заканчивается,' pBuffer' уже указывает один за последним написанным символом. С '* (++ pBuffer) = '\ 0';', у вас есть один неуказанный байт между скопированной частью и 0-терминатором, который вы пишете, и, что более важно, ** вы пишете за конец 'malloc' ed memory **. Это неопределенное поведение. –