我想要做的是将空格分隔的单词变成二维数组。我想的是用' \ 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;
}
答案 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
}