下面是编译器(Hackerrank c编译器)显示的错误。这里是一个指针,并通过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 solution.c:22
22 if ((a[i] != a[j]) && (i >= 0 && j < n)) {
#0 main () at solution.c:22
我的代码是
#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);
}
答案 0 :(得分:4)
在if ((a[i] != a[j]) && (i >= 0 && j < n))
中,条件是相反的。首先检查a[i]
和a[j]
的索引,然后再检查i
和j
对索引a
有效。这意味着,如果i
和/或j
无效,则您已经使用了它们。尝试将顺序反转为if ((i >= 0 && j < n) && (a[i] != a[j]))
。
编辑:其他明显的问题(现在发布了更多代码):
n
用作malloc
的参数,然后进行初始化scanf("%s", a);
的长度i
期间j
和/或k != 0
超出范围,则循环永远不会终止a[i] == a[j]
期间k != 0
,则循环永远不会终止通常的nitpicks:
malloc
的返回值sizeof(char)
根据定义始终为1,乘以则毫无意义