user-0 提问: 输入字符串 ，输入数字n，从n开始返回后面的字符。代码求指错。

回复:
user: user-1
content: 引用 5 楼 xuzhouweihao 的回复:1.change函数定义的地方，s怎么没有类型啊 2.malloc申请的内存，在函数中没有发现释放的地方 3.因为循环执行了p++操作，所以你在change函数返回的地方，返回的地址不是初始的p的地址。   这个应该是你比较疑惑的地方吧。  楼主最好使用void change(char *in, char*out, int n)类似的定义，这样就可以在调用该函数的前后进行内存的申请和释放。赞！

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 引用 14 楼 u013756406 的回复:另外有个新问题。。。求解！！！！！ 就是我取内存空间的时候 p字符串的大小需不需要包括‘\0’的，这个有没有关系？ 虽然我运行了一下，加不加都能正常运行的。。。  需要

user: user-4
content: 我也不知道哎

user: user-0
content: 另外有个新问题。。。求解！！！！！ 就是我取内存空间的时候 p字符串的大小需不需要包括‘\0’的，这个有没有关系？ 虽然我运行了一下，加不加都能正常运行的。。。

user: user-2
content: #include <stdio.h> #include <string.h> char *change(char *s,int n) {     return s+n; } int main() {     int m;     char a[100];      fgets(a,100,stdin);     if (a[strlen(a)-1]=='\n') a[strlen(a)-1]=0;     while (1) {         printf("Input m(0..%d):",strlen(a)-1);         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&m)) {             if (0<=m && m<=strlen(a)-1) {                 printf("%s",change(a,m));                 return 0;             }         }     } }

user: user-5
content: 引用 7 楼 starytx 的回复:这个函数直接来个 return (s + n); 就可以了吧

user: user-0
content: 还有就是这个语句	*(p+i)=*(s+n-1+i);  这是字符串赋值的语句。这个是正确的                                        但是这	*p++=*(s+n-1+i);和	*p++=*(s+n-1)++;为什么错了呢？逻辑是对的，语法错误吗？

user: user-6
content: char *change(char*s,int n)

user: user-0
content: 感谢楼上的回答，，原来我的*s没有定义！！！！！！！！ 另外有个新问题。。。求解！！！！！ 就是我取内存空间的时候 p字符串的大小需不需要包括‘\0’的，这个有没有关系？ 虽然我运行了一下，加不加都能正常运行的。。。

user: user-7
content: #include <stdio.h> #include<string.h> void change(char *s, int n, char *t) {     int i, len;     len = strlen(s);     if(n>0 && n<=len)     {         for(i=0; i<=len-n+1; i++) 			*t++ = *(s + n - 1 + i); 		*t = '\0';     }	     return; }  int main() {	     int m;     char a[100], b[100];     gets(a);     scanf("%d", &m); 	change(a, m, b);     printf("%s\n", b); 	return 0;	 }

user: user-8
content: 这个函数直接来个 return (s + n); 就可以了吧

user: user-0
content: 另外有个新问题。。。求解！！！！！ 就是我取内存空间的时候 p字符串的大小需不需要包括‘\0’的，这个有没有关系？ 虽然我运行了一下，加不加都能正常运行的。。。

user: user-9
content: char *change(*s,int n) *s是啥玩意 基础知识不过关

user: user-10
content: 1.change函数定义的地方，s怎么没有类型啊 2.malloc申请的内存，在函数中没有发现释放的地方 3.因为循环执行了p++操作，所以你在change函数返回的地方，返回的地址不是初始的p的地址。   这个应该是你比较疑惑的地方吧。  楼主最好使用void change(char *in, char*out, int n)类似的定义，这样就可以在调用该函数的前后进行内存的申请和释放。

user: user-11
content: free的话在你用完返回的字符串地址后释放

user: user-11
content: #include <stdio.h> #include<string.h> char *change(char *s,int n) {     int i,len;     char *p;     len=strlen(s);     if(n>0&&n<=len-1)     {         p=(char *)malloc((len-n+1)*sizeof(char));         strcpy(p,&s[n]);//有函数不用你为啥要那样写呢，         return p;     } else {   return s;//错了啥也不做 }               return p; } void main() {           int m;     char a[100]={0},b[100]={0};//这个地方不知道会不会自动初始化为零我习惯了一半都会自己初始化为零     gets(a);//这个地方不多说了//正儿八经程序你要敢gets老板不弄死你，这玩意不检查长度     scanf("%d",&m);     printf("%s",change(a,m));       }

user: user-12
content: 引用 楼主 u013756406 的回复:#include <stdio.h> #include<string.h> char *change(*s,int n) //<<<<<<<<<<<<<<<------ char *s { }  } 类型。 另外，什么时候free？

user: user-0
content: 编译错误。我的想法是，调用函数change 把原来的地址放进去，然后函数返回新的字符串地址p