2016-03-30 2 views
-3

то, что я хочу сделать, это получить пробелы в разделенных словах в 2-й массив. Я думаю, что это место заменяется на «\ 0», поэтому я могу скопировать строку в array.And затем добавить указатель строки к месту после «\ 0». Упорядочение сделайте это до последнего. Но когда я это сделал, я рассмотрю, как я могу освободить указатель. Возможно, я могу сохранить его первым, поэтому я использую char * t = s. Но когда я освобожу t, я получаю ошибку сегмента. Как я должен освободить указатель s после того, как он переместится в другое место. у меня также есть некоторые вопросы: 1.after I malloc sizeof (char) * 15 memory, я ожидаю printf strlen (s) Я могу распечатать 15, но я получаю 0, почему? Если я хочу знать, размер s сейчас, как мне это сделать? 2.after strcpy str to s, strlen s становится 11.But I malloc размером 15, где будет левая память? эта программа?c language Как я освобождаю указатель после того, как я его переместил

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

int main(){ 

    char buf[10][5]; 
    char *str = "10 8 6 9 76"; 
    char *s; 
    char *t = s; 

    s = (char *)malloc(sizeof(char)*15); 
    printf("strlen 1 s:%d\n",strlen(s)); 

    memset(s,0x00,sizeof(char)*15); 
    printf("strlen 2 s:%d\n",strlen(s)); 

    strcpy(s,str); 

    int n = strlen(s); 
    int i = 0; 
    int j = 0; 
    int k = 0; 


    for(i = 0; i < n; i++){ 
     if(s[i] == ' '){ 
      s[i] = '\0'; 
      strcpy(buf[k], s); 
      s += (i+1); 
      k++; 
      n = n - i - 1; 
      i = 0; 
     } 
    } 
    printf("s:%s\n",s); 
    strcpy(buf[k], s); 


    for(j = 0; j<= k; j++){ 
     printf("buf[%d]:[%s]\n",j,buf[j]); 
    } 
    printf("j:%d\n",j); 

    free(t); 
    return 0; 
} 

ответ

3

Основная проблема заключается в том, что вы назначаете s к t перед выделением памяти для s:

char *t = s; 

, а затем вы пытаетесь освободить t, которые указывают на ун-инициированную памяти.

Если вы скомпилируете свой код с -Wall, вы получите предупреждение.

Вы должны установить t = s после выделения памяти s.

Кроме того, всегда проверять возвращаемое значение таНос (нет необходимости брось):

s = malloc(sizeof(char)*15); 
if (s == NULL) { 
    // Error! 
    return 1 
} 
+1

В процессе обучения C это всегда хорошая идея, чтобы включить предупреждения '-Wall -Wextra'. Это предотвращает множество ошибок. – Boiethios

+0

Да и, возможно, также '-pedantic' –

+0

@terence hill Привет, не могли бы вы мне помочь из-за смущения: после того, как я указатель malloc s sizeof 15, я strcpy длиной 11 к нему. Что относительно левой памяти не используется? – Hhdzhu

Смежные вопросы