C 显示黑客等级中的分段错误
下面是编译器(Hackerrank c编译器)显示的错误。这里a是指针,通过malloc分配内存块的起始地址,并在运行时给输入一个字符串。有人能帮我吗C 显示黑客等级中的分段错误,c,C,下面是编译器(Hackerrank c编译器)显示的错误。这里a是指针,通过malloc分配内存块的起始地址,并在运行时给输入一个字符串。有人能帮我吗 GDB trace: Reading symbols from solution...done. [New LWP 4659] Core was generated by `solution'. Program terminated with signal SIGSEGV, Segmentation fault. #0 main () at s
GDB trace:
Reading symbols from solution...done.
[New LWP 4659]
Core was generated by `solution'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 main () at solution.c:22
22 if ((a[i] != a[j]) && (i >= 0 && j < n)) {
#0 main () at solution.c:22
GDB跟踪:
从解决方案中读取符号…完成。
[新LWP 4659]
核心由“解决方案”生成。
程序以信号SIGSEGV终止,分段故障。
#0 main()位于solution.c:22
22如果((a[i]!=a[j])&&(i>=0&&j
我的代码是
#include <stdio.h>
#include <stdlib.h>
int main() {
int n, k, i, j, mid;
char *a;
int *l;
a = (char *)malloc((n + 1) * sizeof(char));
scanf("%d", &n);
scanf("%d", &k);
scanf("%s", a);
mid = (0 + (n - 1)) / 2;
if (n % 2 == 0) {
i = mid;
j = mid + 1;
l = (int *)malloc((n / 2) * sizeof(int));
} else {
i = mid;
j = mid;
l = (int *)malloc((n / 2 + 1) * sizeof(int));
}
while (k != 0) {
if ((a[i] != a[j]) && (i >= 0 && j < n)) {
if (a[i] > a[j]) {
a[j] = a[i];
k--;
i--;
j++;
} else {
a[i] = a[j];
k--;
i--;
j++;
}
}
}
printf("%s", a);
}
#包括
#包括
int main(){
int n,k,i,j,mid;
char*a;
int*l;
a=(char*)malloc((n+1)*sizeof(char));
scanf(“%d”和“&n”);
scanf(“%d”和“&k”);
scanf(“%s”,a);
mid=(0+(n-1))/2;
如果(n%2==0){
i=中等;
j=mid+1;
l=(int*)malloc((n/2)*sizeof(int));
}否则{
i=中等;
j=中等;
l=(int*)malloc((n/2+1)*sizeof(int));
}
while(k!=0){
如果((a[i]!=a[j])&&(i>=0&&ja[j]){
a[j]=a[i];
k--;
我--;
j++;
}否则{
a[i]=a[j];
k--;
我--;
j++;
}
}
}
printf(“%s”,a);
}
在中,如果((a[i]!=a[j])&(i>=0&&j
条件是相反的。首先索引a[i]
和a[j]
在检查i
和j
是否对a
索引有效之前。这意味着如果i
和/或j
无效,您已经使用了它们。如果((i>=0&&j
编辑:其他明显的问题(现在发布了更多代码):
在初始化之前用作n
的参数malloc
- 您不限制
scanf(“%s”,a);
- 如果
和/或i
在j
时超出范围,则循环永远不会终止k!=0
- 如果
而a[i]==a[j]
,则循环永远不会终止k!=0
- 不要强制转换
malloc的返回值
根据定义总是1,乘以它是没有意义的sizeof(char)
中,如果((a[i]!=a[j])&(i>=0&&j
条件是相反的。首先索引a[i]
和a[j]
在检查i
和j
是否对a
索引有效之前。这意味着如果i
和/或j
无效,您已经使用了它们。如果((i>=0&&j
编辑:其他明显的问题(现在发布了更多代码):
在初始化之前用作n
的参数malloc
- 您不限制
scanf(“%s”,a);
- 如果
和/或i
在j
时超出范围,则循环永远不会终止k!=0
- 如果
而a[i]==a[j]
,则循环永远不会终止k!=0
- 不要强制转换
malloc的返回值
根据定义总是1,乘以它是没有意义的sizeof(char)
中条件的顺序很可能会很好。您好,请共享您的代码,或者使用一个较小的版本,让我们可以轻松重现问题。我喜欢使用有意义的变量名的程序。此外,scanf返回一个有用的值。切换中条件的顺序很可能会很好e如果
。您好,请共享您的代码,或一个较小的版本,让我们可以轻松重现问题。我喜欢使用有意义的变量名的程序。此外,scanf还返回一个有用的值