приложение зависает, когда я пытаюсь получить данные из строки Stuct? - PullRequest
1 голос
/ 27 ноября 2011

Я только недавно задал вопрос и получил помощь, но у меня есть другая проблема с моей пользовательской строкой c.все компилируется нормально, но когда я пытаюсь получить что-то, оно зависает или может быть, когда я его удаляю.Что я делаю неправильно?вот мой код:

main.c

#include <stdio.h>
#include "String.h"

int main(int argc, char *argv[]) {
  String *some_string = String_New("hello");
  printf("%s\n", String_CharPtr(some_string));
  String_Delete(some_string);
  return 0;
}

String.h

#ifndef _STRING_H
#define _STRING_H

typedef struct String String;

extern String *String_New(char */*basic_string*/);
extern void String_Delete(String */*string*/);
extern char *String_CharPtr(String */*string*/);
extern unsigned int String_GetLength(String */*string*/);
extern unsigned int String_GetSize(String */*string*/);

#endif

и наконец:

String.c

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

#include "String.h"

struct String {
  char *basic_string;
  unsigned int length;
};

String *String_New(char *basic_string) {
  String *temp = NULL;
  temp->length = strlen(basic_string);
  temp->basic_string = (char *) malloc(temp->length + 1);
  strcpy(temp->basic_string, basic_string);
  return temp;
}

void String_Delete(String *string) {
  free(string->basic_string);
  string->basic_string = NULL;
}

char *String_CharPtr(String *string) {
  return string->basic_string;
}

unsigned int String_GetLength(String *string) {
  return string->length;
}

unsigned int String_GetSize(String *string) {
  return string->length + 1;
}

Ответы [ 3 ]

1 голос
/ 27 ноября 2011

Вот подсказка: вы правильно управляете памятью для символьного буфера, однако вы забыли об управлении памятью для самой структуры String.

0 голосов
/ 27 ноября 2011

Это не будет работать. Измените часть своего кода на это:

#include <stdlib.h>
...
String *String_New(char *basic_string) {
    String *temp = calloc (1, sizeof (struct String));
    temp->length = strlen (basic_string);
    temp->basic_string = strdup (basic_string);
    return temp;
}

void String_Delete(String *string) {
    free(string->basic_string);
    free (string);
}
0 голосов
/ 27 ноября 2011
String *temp = NULL;
temp->length = strlen(basic_string);

Вы не выделили память для temp.

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