如何在c中为指针分配整数?

时间:2018-09-04 02:03:11

标签: c list pointers null function-pointers

任务是创建一个函数

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

,如果整数为“ data”,则在列表的第一个numEls中进行搜索,以找到两个与“ pairSum”相加的相邻整数,并返回指向两个整数中第一个整数的位置的指针。如果没有两个整数相加成对,则该函数应返回空指针。我认为除了指针部分,我所有的代码都正确。

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");
    }
}

但是我只是遇到段错误,它应该返回

Found at position 8

3 个答案:

答案 0 :(得分:6)

我认为

*point = i-1;

应该是

point = &data[i-1];

没有开始的*

答案 1 :(得分:6)

您要提出的问题的答案:

  

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

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

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

正如Miguel解释的那样,*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 :(得分:2)

您的代码中的错误在以下行中:  *point = i-11;

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

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

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

由于您正试图将i-1存储到没有内存(或内存不足)的位置,因此出现了分段错误。

尽管按照您的测试方法从语义上来说是错误的,但是如果您想使该语句运行而不会产生错误,则应该为int *point分配内存。例如int *point = (int *) malloc(sizeof(int));