user-0 提问: C程序小问题

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-0
content: 哦，明白了，谢谢

user: user-2
content: 引用 3 楼 JILAU_WHO_AM_I_Q234 的回复:[quote=引用 1 楼 user-4的回复:]struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀[/quote] 此时twos的p和arr是一样的，因为是指针，它们都指向的malloc申请的堆上的一段空间，free其一，都是将malloc之后的空间归还了（free），既然free，再使用是未定义行为。

user: user-3
content: 引用 3 楼 JILAU_WHO_AM_I_Q234 的回复:[quote=引用 1 楼 user-4的回复:]struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀[/quote] arr是赋给了p，但是这里不是内存拷贝，只保存地址 arr被释放后，p指向的地址也就无意义了

user: user-0
content: 引用 1 楼 user-4的回复:struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>   #define LEN 100  struct two {     int Length;     char *p; }; struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();          if(ch!='\n')         {             arr[i++] = ch;         }else             break;     }     twos.Length = i;     twos.p = arr;     printf("i = %d\n", i);     //free(arr);    /*This arr can't free here.*/     return twos; }  int KillSpace(char *,int n); int main(void) {     char * pt;     int i;     int cnt; /* count the number of space */      struct two first;     printf("请输入字符串:(空行结束)\n");     first = Get();     pt = (char *)malloc(first.Length);     for(i = 0;i < first.Length;i++)     {         pt[i] = first.p[i];     }     cnt = KillSpace(pt,first.Length);      for (i = 0; i < first.Length - cnt; i++)         printf("%c", pt[i]);     putchar(10);     free(pt);     free(first.p);    /* free here */     system("pause");     return 0; } int KillSpace(char * p1,int n) {     char ch;     int i = 0, j;     int cnt = 0;     while(1)     {         ch = p1[i];         if(ch != ' '&& i < n) {             //printf("%c\n",p1[i]);             i++;         }         else if(i == n)             break;         else {    /* 向前覆盖方法 */             cnt++;             for (j = i; j < n - cnt; j++)                 p1[j] = p1[j+1];         }     }      return cnt; } 以上的代码参考一下吧； 问题主要是，Get函数里将申请的空间立即释放，这是未定义的，因为还未使用就释放，那申请空间做什么呢？！！ kill空格，其实是一个伪功能，因为根本就没有删除嘛。

user: user-4
content: struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了