c语言我移动指针后如何释放指针

时间:2016-03-30 12:11:18

标签: c arrays pointers

我想要做的是将空格分隔的单词变成二维数组。我想的是用' \ 0'替换空格,所以我可以将字符串复制到数组。然后添加字符串指向' \ 0'。保持直到最后。但是当我完成它时,我考虑如何释放指针。我想也许我可以先保存它所以我使用char * t = s。但是当我释放t时我得到一个段错误。所以我应该在移动到另一个地方之后释放s指针。 除此之外,我还有一些问题: 1.在我malloc一个sizeof(char)* 15内存后,我期待printf strlen(s)我可以打印15,但我得到0,为什么?如果我想知道s的大小,我该怎么办?吗 2. strcpy str to s之后,strlen s变为11.但是我的malloc大小为15,左边的内存会去哪里?这会影响程序吗?

#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;
}

1 个答案:

答案 0 :(得分:3)

主要问题是您在为s分配内存之前将t分配给s

char *t = s;

然后您尝试释放t,指向未初始化的内存。

如果您使用-Wall编译代码,则会收到警告。

您应在t = s的内存分配后设置s

另外,总是检查malloc的返回值(不需要强制转换):

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