如何将指向动态分配的数组的指针作为函数参数传输

时间:2017-11-28 18:37:33

标签: c arrays pointers dynamic-memory-allocation

我想在函数内部分配一个数组,并且能够在其外部使用指向该数组的指针。我不知道我的代码有什么问题

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

void alloc_array (int **v, int n)
{
    *v=(int *)calloc(n,sizeof(int));
    printf ("the address of the array is %p",v);
}

void display_pointer (int *v)
{
    printf ("\n%p",v);
}

int main()
{
    int *v;
    alloc_array(&v,3);
    display_pointer(v);

    return 0;
}

我希望在printf中获得相同的地址,但事实并非如此。我的错是什么?

3 个答案:

答案 0 :(得分:3)

void alloc_array (int **v, int n)
{
    *v = calloc(n,sizeof(int));
    printf("the address of the array is %p", *v);
    //                                   ----^
}

请注意printf来电中的其他明星。

另外,请勿投放malloc / calloc的返回值。

答案 1 :(得分:1)

v中的

alloc_array包含指针变量的地址。该变量在v中为main()

你不关心它。因为它不会改变。但是vmain的内容会。

您应该打印*v,但为什么?

因为valloc_array的内容包含您分配的内存的地址。

display_pointer不需要这个。因为在这里传递指针变量本身,并且函数的本地副本将包含您分配的内存地址。

答案 2 :(得分:1)

在此代码段中

package testscripts;

public class ExecutableLeadTest {
    public static void main(String[] args) throws Exception {
        ArrayList a = new ArrayList();
        FileInputStream file = new FileInputStream("D:\\LeadSuite.xlsx");
        XSSFWorkbook b = new XSSFWorkbook(file);
        Sheet s = (Sheet) b.getSheet("Teststeps");
        Iterator itr = s.iterator();
        while (itr.hasNext()) {
            Row rowitr = (Row) itr.next();
            Iterator cellitr = rowitr.cellIterator();
            while (cellitr.hasNext()) {
                Cell celldata = (Cell) cellitr.next();
            }
        }
        Cell Celldata;
        switch (Celldata.getCellType()) {
            case Cell.CELL_TYPE_STRING:
                a.add(Celldata.getStringCellValue());
                break;
        }
    }

    {
        for (int i = 0; i < a.size(); i++) {
            if (a.get(i).equals("KOHILA")) {
                System.out.println(a.get(i));
                System.out.println(a.get(i + 1));
            }
        }
    }
}

函数int *v; alloc_array(&v,3); display_pointer(v); 接受变量(指针)alloc_array的地址,并在函数中输出该地址

v

另一方面,函数printf ("the address of the array is %p",v); 接受存储在变量display_pointer中的值,并且该值在函数内输出

v

在函数printf ("\n%p",v); 中再添加一条语句,您将看到差异

alloc_array