任何人都可以通过以下方式指导我: 当我尝试执行程序时没有任何编译错误时,在将字符从一个字符串复制到另一个字符串时遇到了段错误,供参考-我的程序从一个字符串中找出指定长度的最常见子字符串>
我的代码如下:
#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);
}
}
请引导我完成此过程,非常感谢您的帮助。
答案 0 :(得分:0)
sub=malloc(i*sizeof(char));
为i
x char
而不是i
x char*
分配空间。
即使您拥有正确的权限(sizeof(char*)
,您仍然需要分配该数组的每个成员,以便有足够的空间复制到其中。
...而且甚至不让内存泄漏开始...
答案 1 :(得分:0)
声明char **subs
是不合适的。 *(*(sub + i) + j)
并未指出您的期望。
请参见示例*(*(sub + 1) + 2)
。
首先,sub + 1
|char| ... *6 ... |char|'c'|char| ... |
^ ^
| |
sub sub+1
在上述情况下,*(sub + 1)
等于'c'。
然后,*(sub + 1) + 2
等于'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';