如何解决我无法检测到的 C 上的运行时错误
我的程序输入一个元素序列,并检查二叉树中是否存在相同数字的从上到下的序列。
明确地说,我将我的答案提交给我的教授设置的系统,该系统仅以 Failed - run time error
进行响应,没有其他详细信息。当我在 Xcode 上编译并运行它时,它运行良好,没有运行时错误。我已经检查了除以零、内存泄漏、数组越界等,但我似乎无法发现错误。由于这个原因,我的代码会有点冗长,因为我无法找出有问题的部分。
node *n;
node *newNode(int data)
{
node *new_node = (node *)malloc(sizeof(node));
new_node->number = data;
new_node->left = NULL;
new_node->right = NULL;
return new_node;
}
node *insert(int arr2[],node *ptr,int i,int M2,int x)
{
if (i < M2)
{
node *temp = newNode(arr2[i]);
ptr = temp;
if (ptr -> number == x)
n = ptr; // n is a global variable of type node*
ptr->left = insert(arr2,ptr->left,2 * i + 1,M2,x);
ptr->right = insert(arr2,ptr->right,2 * i + 2,x);
}
return ptr;
}
void checkPath(int arr1[],int *i,int M1)
{
node *temp = (node *)malloc(sizeof(node));
if (n == NULL)
return;
while ((*i) < M1)
{
if (n->left->number == arr1[*i])
{
(*i)++;
temp = n->left;
n = temp;
}
else if(n->right->number == arr1[*i])
{
(*i)++;
temp = n -> right;
n = temp;
}
else
break;
}
}
int main()
{
int N,M1,z;
scanf("%d",&N);
for (int i = 0; i < N; i++)
{
z = 1;
scanf("%d",&M1);
int arr1[M1];
for (int j = 0; j < M1; j++)
scanf("%d",&arr1[j]);
scanf("%d",&M2);
int arr2[M2];
for (int k = 0; k < M2; k++)
scanf("%d",&arr2[k]);
node *ptr = (node *)malloc(sizeof(node));
ptr = insert(arr2,ptr,arr1[0]);
checkPath(arr1,&z,M1);
if (z == M1)
printf("True\n");
else
printf("False\n");
free(ptr);
}
return 0;
}
很抱歉这段冗长的代码。提前致谢!
解决方法
至少有这个问题:丢失记忆。
checkPath()
从不使用 malloc()
的结果。这表明该函数存在逻辑错误。
void checkPath(int arr1[],node *ptr,int *i,int M1)
{
node *temp = (node*) malloc(sizeof(node));
...
while((*i) < M1)
...
temp = n -> left;
n = temp;
...
temp = n -> right;
n = temp;
...
}
}
这里的代码是读取和设置全局变量n
。
这可能是也可能不是关键问题。
,输入数据呢?能保证没问题吗?
代码中的数据输入没有验证。
好吧,我刚刚重现了失败:
./test
2
1
1
1
1
True
2
2
2
2
2
2
Segmentation fault (core dumped)
鉴于“节点”是这样的:
typedef struct _node
{
int number;
struct _node *left;
struct _node *right;
} node;
但是我还没有发现逻辑中的实际错误。 顺便说一句,逻辑有点奇怪。
附言此输入也会导致崩溃:
./test
2
2
2
2
2
2
2
2
Segmentation fault (core dumped)
,
考虑在访问“左”或“右”之前添加指针检查
if (n->left && n->left->number == arr1[*i])
和
else if(n->right && n->right->number == arr1[*i])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。