我目前正在尝试学习如何在C中同时使用指针和函数,我认为这并不容易。我试图打印数组中的最后一个元素,它实际上做了相反的事情,打印了第一个元素。我知道人们通常使用for循环,但我不知道如何处理这种问题,因此我想我可以用if语句来代替它。
编辑:为什么if语句在这种情况下不起作用?这似乎是逻辑上的,它应该工作。
我的main.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "functions.h"
#define Size 7
int main(void)
{
int array1[] = { 11, 88, 5, 9, 447, 8, 68, 4 };
maxValue(array1, Size);
return 0;
}
我的functions.h文件:
#pragma once
#ifndef FUNCTIONS_H
#define FUNCTIONS_H
int maxValue(const int *, int);
#endif
我的functions.c文件:
#include "functions.h"
#include <stdio.h>
#include <stdlib.h>
int maxValue(const int *array1, int Size)
{
int max = array1[0];
if (max < array1[Size]) {
Size++;
max = array1[Size];
}
printf("Max value: %d \n", max);
}
发布于 2019-05-26 20:29:15
为什么if语句在这种情况下不起作用?这似乎是合理的,它应该工作...?因为在这里
if (max < array1[Size]) { }
Size
被定义为7
,并且您正在比较array1[0]
和array1[7]
,即11 < 4
-> false,因此它不会进入if
块,因此执行最后一个printf
并打印max
。但这不是一个正确的逻辑,如果if
块为真,那么进一步的Size++
将导致访问越界数组元素,从而导致未定义的行为。
int maxValue(const int *array1, int Size)
{
int max = array1[0];
if (max < array1[Size]) { /* 11 < 4 false, skips if block */
//Size++; /* this is wrong as Size++ here and next accessing array1[Size] cause UB due to accessing out of bound array element */
max = array1[Size];
}
printf("Max value: %d \n", max); /* max is stills array1[0] i.e 11 */
}
发布于 2019-05-26 22:41:20
让我们模拟一下,当CPU使用这些参数进入maxValue函数时会做些什么。1.变量max
被赋值为array1[0]
,即11. 2.如果max
(11)小于array1[7]
(4),则为。它不是,所以不会执行if
块。3. Print max
:打印11.
另一件事:你的程序会导致未定义的行为。让我们举一个例子,其中array1[0]
是3,而不是11。if块将被执行(3 < 4),因此:Size
递增到8。max
被分配array1[8]
。由于array1
中的最后一个索引是7(这是您声明数组的方式),因此您正在访问一个不应该访问的内存地址。这是未定义的行为。
https://stackoverflow.com/questions/56313458
复制相似问题