【C语言】空指针 && 野指针 解引用问题

   目录

空指针

情况一:

情况二:

野指针

情况一:

情况二:


     在做两数交换时,使用指针来接收需要交换的数是什么情况?以下是我的一些实验结论

正常交换

void swap(int* x, int* y)
{
	int temp = 0;
	temp = *x;//*x为指针x的解引用操作,表示a的值
	*x = *y;
	*y = temp;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);

	printf("交换前a=%d,b=%d\n", a, b);

	swap(&a, &b);
	printf("交换后a=%d,b=%d\n", a, b);

	return 0;
}

空指针

  • 情况一:

 void swop(int* x, int* y)
 {
     int* temp = NULL;
     *temp = *x;//*x为指针x的解引用操作,表示a的值
     *x = *y;
     *y = *temp;
 }
 int main()
 {
     int a = 0;
     int b = 0;
     scanf("%d %d", &a, &b);
 ​
     printf("交换前:a=%d,b=%d\n", a, b);
     swop(&a, &b);
 ​
     printf("交换后:a=%d,b=%d\n", a, b);
 ​
     return 0;
 }

temp为空指针,空指针执向0地址,该指针为空,是无效的,不能对无效的指针解引用

当它发生解引用时,会发生指针解引用错误。

  • 情况二:

 void swop(int* x, int* y)
 {
     int* temp = NULL;
     temp = *x;
     //在c语言的语法上这种写法是不正确的
     //但是在指针变量解引用后,看做一个整形变量放到temp指针中是可以放下的
     *x = *y;
     *y = temp;
 }

野指针

  • 情况一:

 void swop(int* x, int* y)
 {
     int* temp;
     *temp = *x;
     *x = *y;
     *y = *temp;
 }

系统直接崩溃,因为temp为野指针

野指针,即未初始化的指针,没有访问权限的地址(指针)

  • 情况二:

 void swop(int* x, int* y)
 {
     int* temp;
     temp = *x;
     //在c语言的语法上这种写法是不正确的
     //但是在指针变量解引用后,看做一个整形变量放到temp指针中是可以放下的
     *x = *y;
     *y = temp;
 }

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
这段代码实现了一个选择排序的算法,但是存在一些问题。 1. 在函数开头,对头指针进行了判空操作,但没有对头指针的数据域进行判空操作。如果数据域为空,可能会导致后续的求和和平均值计算出错。 2. 在定义 dummyHead 结点时,使用了动态内存分配函数 malloc,但没有对内存分配结果进行判空操作。如果分配内存失败,会导致后续的代码出现问题。 3. 在选择最小值的内层循环中,没有更新 min 结点的指针。在找到更小的结点时,应该更新 min 指向该结点。 4. 在交换节点数据的代码中,使用了 memcpy 函数进行数组数据的交换,但是没有考虑到数组长度的问题。应该将 sizeof(current->score) 替换为 sizeof(current->score[0]) * 3。 综上所述,可以对代码进行以下改进: ``` STU* selectionSort(STU* head) { if (head == NULL || head->next == NULL) { return head; } STU* dummyHead = (STU*)malloc(sizeof(STU)); if (dummyHead == NULL) { printf("内存分配失败!\n"); return NULL; } dummyHead->next = head; STU* current = dummyHead->next; STU* min = NULL; STU* temp = NULL; while (current != NULL) { min = current; temp = current->next; while (temp != NULL) { int sum_current = current->score[0] + current->score[1] + current->score[2]; int sum_temp = temp->score[0] + temp->score[1] + temp->score[2]; double avg_current = (double)sum_current / 3; double avg_temp = (double)sum_temp / 3; if (avg_temp < avg_current) { min = temp; } temp = temp->next; } OutOneNode(current); if (min != current) { int temp_score[3]; memcpy(temp_score, current->score, sizeof(current->score[0]) * 3); memcpy(current->score, min->score, sizeof(min->score[0]) * 3); memcpy(min->score, temp_score, sizeof(temp_score)); } current = current->next; } STU* sortedHead = dummyHead->next; free(dummyHead); return sortedHead; } ``` 这样修改后,代码应该能够正常运行了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

榶曲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值