如何在c中为指针赋一个整数?

问题描述 投票:1回答:3

任务是创建一个功能

 int* pairSumSearch(int* data, int numEls, int pairSum)

如果ints'数据',则在列表的第一个numEls内搜索,以找到与'pairSum'相加的两个相邻整数,并返回指向两个整数中第一个的位置的指针。如果没有两个int总和为pairum,那么该函数应该返回一个空指针。我认为我的所有代码都是正确的,除了指针部分。

int* pairSumSearch(int* data, int numEls, int pairSum) 
{
    int* point = NULL;
    int checker = data[0];
    for (int i = 1; i < numEls-1; i++) {
        if (checker + data[i] == pairSum) {
            *point = i-1;
            break;
        } else {
            checker = data[i];
        }
    }
    return point;
}

测试用例是

int main(void)
{
    int data[] = {1, 2, 3, 4, 5, 6, 7, 10, 9, 10}; 
    int* p = pairSumSearch(data, 10, 19);
    if (p != NULL) {
        printf("Found at position %zd\n", p - data);
    }
    else {
        puts("Not found");
    }
}

但我只是得到了seg错误而应该返回

Found at position 8
c list pointers null function-pointers
3个回答
6
投票

我认为

*point = i-1;

应该

point = &data[i-1];

没有首发*


6
投票

你要问的答案是:

如何在c中为指针赋一个整数

很容易你没有。指针包含一个地址。你永远不应该(好吧,有特殊情况,但你还没有)给指针分配一个整数。你问的是错误的问题,因为你不想这样做。

*point = i-1的意思是将地址point的内存值更改为i-1

正如米格尔所解释的那样,*point = i-1是完全错误的,应该是point = &data[i-1]。看起来你正试图返回索引,但你应该返回一个指针。

我想你应该找一个指针教程。网上有很多。

在第8位找到

不,它应该打印Found at position 7,因为第一个索引是零。

你的代码有点乱。这更清洁。

int* pairSumSearch(int* data, int numEls, int pairSum)
{
    for (int i = 0; i < numEls-1; i++) {
        if (data[i] + data[i+1] == pairSum) {
            return &data[i];
        }
    }
    return NULL;
}

2
投票

你的代码中的错误就在这一行:*point = i-11;

您试图在point指向的位置存储索引(数据)而不是地址(指针)。

问题是,你的int *变量point没有分配任何内存。或者换句话说,你的指针没有指向任何地方。

要么直接指向数组data的索引。例如point = &(data[i-1]),那么你将能够返回该对的前一个元素的地址,并且您的代码将正常工作。

您正在尝试将i-1存储到没有内存(或没有足够内存)的位置时出现分段错误。

虽然根据您的测试方法在语义上会出错,但如果您希望在不生成错误的情况下使该语句生效,则应将内存分配给int *point。例如int *point = (int *) malloc(sizeof(int));

© www.soinside.com 2019 - 2024. All rights reserved.