动态分配2D数组

时间:2018-08-28 09:03:42

标签: c

我的任务是根据A和B中包含n个元素的值制作2dn二维数组。

我发现了这种为2D数组分配内存的方法,它可以工作,但是我不知道它是否正确或为什么正确

int **tab2D(int A[],int B[],int n)
{
    int **newTab = malloc(n*sizeof(int*));
    newTab[0] = A;
    newTab[1] = B;
    return newTab;
}

我知道还有其他方法可以做到这一点,但我对此感到很好奇。

2 个答案:

答案 0 :(得分:0)

据我了解您的代码,它应该像这样工作。

package aShot;

import java.io.File;

import javax.imageio.ImageIO;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import ru.yandex.qatools.ashot.AShot;
import ru.yandex.qatools.ashot.Screenshot;

public class ashot_google_homepage_logo {

    public static void main(String[] args) throws Exception {

        System.setProperty("god.bless.you", "C:\\Utility\\BrowserDrivers\\chromedriver.exe");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("start-maximized");
        options.addArguments("disable-infobars");
        options.addArguments("--disable-extensions"); 
        WebDriver driver =  new ChromeDriver(options);
        driver.get("https://jquery.com/");
        WebElement myWebElement = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//h3[contains(.,'Lightweight Footprint')]")));
        Screenshot myScreenshot = new AShot().takeScreenshot(driver, myWebElement);
        ImageIO.write(myScreenshot.getImage(),"PNG",new File("./Screenshots/elementScreenshot.png"));
        driver.quit();
    }
}

可以看作

int **tab2D(int A[],int B[],int n)

,因此您将指针传递给已经分配的两个数组。 然后,您为指针到指针分配一些内存

int **tab2D(int *A,int *B, int n)

我认为应该是

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

相反,我假设因为您有 int **newTab = malloc(2*sizeof(int*)); A,它们的长度均为B,所以长度相同。然后,取消引用新的指向指针的指针,并将指针分配给数组

n

可以写为

newTab[0] = A;
newTab[1] = B;

答案 1 :(得分:0)

这不是int的2D数组,而是指向int的指针的数组。

之所以有效,是因为数组的每个元素都指向一个包含int s数组的地址

使用堆栈的类似代码,只是为了说明其工作原理:

int a[] = {1, 2};
int b[] = {3, 4};
int *arr[] = {a, b};

一个真实的2D数组应该可以在连续区域中工作(没有碎片),您可以使用指向VLA的指针来实现此目的:

int rows, cols;

scanf("%d %d", &rows, &cols);

int (*arr)[cols] = malloc(sizeof(int [rows][cols]));