【问题标题】:Problems with pointers in a function函数中的指针问题
【发布时间】:2016-07-31 00:59:57
【问题描述】:

我需要一些帮助。当我尝试输入数据并将其保存到指针时,我的程序崩溃了。我可以成功地将数据输入到动态数组的第一个元素,我什至可以打印该数据。但是,在那之后,当我尝试输入第二个元素时,我的程序崩溃了。调试器不显示任何错误或警告。

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

static const char SPRTR[] = "//---------------------------------------------------------------------------//";
static const char ERR_MSG[] = "ERROR! Try again.";

void create_array(int **data, int *n, int *arr_max)
{
    int i;
    int err;
    char temp;

    do
    {
        err = 0;
        printf("\nMaximum number of array elements: ");
        if (((scanf("%d", arr_max)) < 1) || (*arr_max <= 0))
        {
            printf("%s\n", ERR_MSG);
            err = 1;
        }
        printf("\n%s\n", SPRTR);
        while ((temp = getchar()) != '\n' && temp != EOF);
    } while (err != 0);

    do
    {
        err = 0;
        printf("\nNumber of array elements (max. %d): ", *arr_max);
        if (((scanf("%d", n)) < 1) || (*n > *arr_max) || (*n <= 0))
        {
            printf("%s\n", ERR_MSG);
            err = 1;
        }
        printf("\n%s\n", SPRTR);
        while ((temp = getchar()) != '\n' && temp != EOF);
    } while (err != 0);

    *data = (int *) malloc(sizeof(int) * (*n));

    for (i = 0; i < *n; i++)
    {
        do
        {
            err = 0;
            printf("\nValue of %d array element: ", i);
            if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0))
            {
                printf("%s\n", ERR_MSG);
                printf("\n%s\n", SPRTR);
                err = 1;
            }
            while ((temp = getchar()) != '\n' && temp != EOF);
        } while (err != 0);
    }
}

int main()
{
    int n;
    int arr_max;
    int *data;

    create_array(&data, &n, &arr_max);

    return 0;    
}

【问题讨论】:

  • 调试器.......................

标签: c arrays function pointers dynamic


【解决方案1】:

您的编译器(也包括我的)没有发现错误,因为您使用了正确的类型,但此语句中有两个错误(实际上是相同错误的两倍):

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0))

data 是指向您的int * 的指针(地址),其中包含您的malloc 的结果。 所以您可以访问的ints 是(*data)[i],它们的地址是*data + i。所以这一行应该被替换为:

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0))

至少它对我有用。

【讨论】:

  • 谢谢。这真的很有帮助,因为我是 C 语言的新手(和整体编程),有时指针和地址会让我感到困惑。
【解决方案2】:

问题似乎出在线路上

if (((scanf("%d", *(data + i))) < 1) || (*(*(data + i)) < 0))

您应该取消引用数据以获取指向当前元素的指针 然后添加偏移量,而不是取消引用不是指向数组本身的指针的位置。

尝试替换 *(data + i) 与 *data + i 所以 if 语句变为:

if (((scanf("%d", *data + i)) < 1) || ((*(*data + i)) < 0))

另外*(*data + i))只是获取数组的偏移量所以可以用(*data)[i]代替,所以if语句就变成了:

if (((scanf("%d", *data + i)) < 1) || ((*data)[i] < 0))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    相关资源
    最近更新 更多