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

标签 c arrays pointers

我想做的是将空格分隔的单词放入二维数组中。我想用“\0”替换空格,这样我就可以将字符串复制到数组中。然后将字符串指针添加到该位置在 '\0' 之后。一直做到最后。但是当我完成它时,我考虑如何释放指针。我考虑也许我可以先保存它,所以我使用 char *t = s。但是当我释放我收到段错误。那么在 s 指针移动到另一个位置后我应该如何释放它。 除此之外,我还有一些问题: 1.当我malloc了一个sizeof(char)*15内存后,我期望printf strlen(s)我可以打印15,但我得到0,为什么?如果我现在想知道s的大小,我该怎么办? 2.strcpy str 到 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;
}

最佳答案

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

char *t = s;

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

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

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

此外,始终检查 malloc 的返回值(无需强制转换):

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

关于c语言移动指针后如何释放它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36308496/

相关文章:

c - 哪里导致死锁?

ruby-on-rails - 用于了解特定方法的所有数组元素是否返回 true 的语法糖?

c - (C) 如何使用动态内存进行字符输入?如何以某种方式组织输入的值?

arrays - Matlab中两个字符串元胞数组的区别

c - 我正在编写一个代码,在其中创建人、与他们结婚、让他们生 child 等,但我无法打印它们

c - vector 在 C 中永远迭代

c - 为什么将第二个值放入此 C 结构体数组中会将第一个槽的值变成乱码?

c++ - 将指针作为参数传递给函数

c++ - 为具有指针成员的类正确重载赋值运算符

c - 指针的垃圾数据