任何人都可以指导我完成此操作: 当我尝试在没有任何编译错误的情况下执行我的程序时,在将字符从一个字符串复制到另一个字符串时出现分段错误。供参考 - 我的程序从字符串中找出指定长度最常出现的子字符串
我的代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char* format(char* str,int l);
void main(){
char *str=malloc(1024*sizeof(char));
char *sub;
int i;
printf("n Enter the string : ");
fgets(str,1024,stdin);
printf("n");
puts(str);
printf("nEnter max no of char for substrings:");
scanf("%d",&i);
sub=malloc(i*sizeof(char));
strcpy(sub,format(str,i));
printf("nSubstring : %s",sub);
free(str);
}
char* format(char* str,int l){
int i,j,k,x,max,pos;
int len =strlen(str);
int *arr=(int*)malloc(len*sizeof(int));
char **subs =(char**)malloc(len*l*sizeof(char));
printf("n test 1 %s %d",str,l);
for(i=0;i<len-l;i++){
for(j=0;j<l;j++){
*(*(subs+i)+j)=*(str+i+j);
}
}
printf("n test 2");
for(i=0;i<l;i++){
for(j=0;j<i;j++){
x=strcmp(subs[i],subs[j]);
if(x==0){
arr[i]=arr[j]+1;
}
}
}
printf("n test 3");
max=arr[0];
for(i=0;i<l;i++){
if(arr[i]>max){
max=arr[1];
pos=i;
}
}
printf("n test 4");
return subs[i];
}
通过函数 format(( 的测试 1 后,程序停止响应。
for(i=0;i<len-l;i++){
for(j=0;j<l;j++){
*(*(subs+i)+j)=*(str+i+j);
}
}
请指导我完成此操作,您的帮助将不胜感激。
sub=malloc(i*sizeof(char));
为i
xchar
分配空间,而不是i
xchar*
。
即使你做对了(sizeof(char*)
(,你仍然需要分配该数组的每个成员,以便有空间可以复制到其中。
。甚至让我们不要从内存泄漏开始...
声明char **subs
是不合适的。*(*(sub + i) + j)
剂量不指向您的期望。
请参阅示例*(*(sub + 1) + 2)
。
首先,sub + 1
|char| ... *6 ... |char|'c'|char| ... |
^ ^
| |
sub sub+1
在上述情况下,*(sub + 1)
just 等于 'c'。
然后,*(sub + 1) + 2
just 等于'c'+2
,这是一个未知地址。
最后,*(*(sub + 1) + 2)
意味着访问地址为'c'+2
的内容。
我建议:
char *array = malloc(sizeof(char) * cols * rows);
// Access element at (row=i, col=j)
// Use []
array[i * cols + j] = 'c';
// Or use *()
*(array + i * cols + j) = 'c';