函数在c中传递多维数组

时间:2016-02-06 18:14:59

标签: c arrays multidimensional-array

public class GoogleSearchPage {
    // locators
    @FindBy(id = "lst-ib")
    private WebElement searchInputBox;
    @FindBy(name = "btnG")
    private WebElement searchButton;
    @FindBy(id = "ires")
    private WebElement searchResultContainer;
    By searchResultHeader = By.tagName("h3");

    // perform search action with the given text
    public void searchText(String text) {
        searchInputBox.sendKeys(text);
        searchButton.click();
    }

    public List<String> readSearchResults() {
        List<WebElement> searchResults = searchResultContainer
                .findElements(searchResultHeader);

        List<String> searchResultsHeaderText = new ArrayList<String>();
        int size = searchResults.size();
        for (int i = 0; i < size; i++) {
            searchResultsHeaderText.add(searchResults.get(i).getText());
        }
        return searchResultsHeaderText;
    }

}

当我提供#include <stdio.h> void spiral(int a[10][10]) { printf("%d", a[1][3]); } int main() { int r, c, j, i; scanf("%d%d", &r, &c); int a[r][c]; for (i = 0; i < r; i++) for (j = 0; j < c; j++) { scanf("%d", &a[i][j]); } spiral(a); return 0; } 数组

3 x 6

输出为 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ,而应为14

如何解决此问题?

2 个答案:

答案 0 :(得分:3)

如果您分别为int countDigitOne(int n) { if (n <= 0) return 0; int q = n, x = 1, ans = 0; do { int digit = q % 10; q /= 10; ans += q * x; if (digit == 1) ans += n % x + 1; if (digit > 1) ans += x; x *= 10; } while (q > 0); return ans; } 3输入6r,则c的类型不是a(或int[10][10] int(*)[10]论证确实是spiral,它是int[3][6]。数组的内存布局完全不同,导致未定义的行为

您可以通过将大小传递给函数并在数组的声明中使用它来解决此问题:

void spiral(const size_t r, const size_t c, int (*a)[c]) { ... }

按预期调用它:

spiral(r, c, a);

如前所述,使用int a[r][c]作为参数可能更容易阅读和理解,但它给人的错误印象是a实际上是一个数组。不是。编译器将参数视为指向c整数数组的指针,即int (*a)[c]

这让我有点矛盾......一方面我只是为了让事情更容易阅读和理解(这意味着它更容易维护),另一方面新手经常弄错了并且认为一个人可以完整地传递一个数组,而事实上它会衰减到一个可能导致误解的指针。

答案 1 :(得分:0)

有些事情是错误的:在void spiral()中你要求10*10的二维数组,但是你没有这样做。将该部分保留为变量,因此只询问您收到的类型而不是您想要接收的内容,创建动态数组时,您应始终使用malloccallocfree他们之后。起初这可能有点困难,但是当你开始创建更大的程序时,如果你有一个问题或者不理解程序中的指针(*),那么这是必须的,然后问我:

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

void spiral(int **a) {
    printf("%d", a[1][3]);
}

int main() {
    int r, c, j, i;
    scanf("%d%d", &r, &c);
    int **a = malloc(r * sizeof(int*));
    for (i = 0; i < r; i++) {
        a[i] = malloc(c * sizeof(int));
    }
    for (i = 0; i < r; i++) {
        for (j = 0; j < c; j++) {
            scanf("%d", &a[i][j]);
        }
    }
    spiral(a);
    for (i = 0; i < r; i++) {
        free(a[i]); 
    }
    free(a);
    return 0;
}