错误:数组类型具有不完整的元素类型;动态二维数组

时间:2017-08-08 13:20:38

标签: c arrays string multidimensional-array dynamic-memory-allocation

我应该返回输入字符串共有的二维字符串单词数组。

div {
  background: green;
  line-height: 40px; # or height: 40px;
  text-align: center;
}
span {
  background: white;
  display: inline-block;
}

当我编译它时,我得到错误:数组类型具有不完整的元素类型。由于我需要在函数内分配内存,因此我使用#include <stdio.h> #include <malloc.h> #define SIZE 31 int strcmp1(char *word1, char *word2, int len) { while (len-- > 0) { if (!(*word1++ == *word2++)) return -1; } return 0; } void strcpy1(char *emptyStr, char *str, int len) { while (len-- > 0) { *emptyStr++ = *str++; } *emptyStr = '\0'; } void print(char *str) { for (; *str;) printf("%c", *str++); printf("\n"); } char **commonWords(char *str1, char *str2) { char *temp1, *temp2; char commWords[][] = (char**)calloc(10, SIZE); int i = 0; if (str1 == NULL || str2 == NULL) { return NULL; } for (temp1 = str1; *temp1; ++temp1) { if (*temp1 != ' ') { str1 = temp1; while (*temp1++ != ' ') ; int len1 = temp1 - str1; for (temp2 = str2; *temp2; ++temp2) { if (*temp2 ! =' ') { str2 = temp2; while (*temp2++ != ' ') ; int len2 = temp2 - str2; if (len1 == len2) { if (strcmp1(str1, str2, len1)) { strcpy1(commWords[i++], str1, len1); } } } } } } commWords[i] = NULL; return commWords; } int main() { char *name1 = "abc def ghi"; char *name2 = "ghi abc jkl"; char common[][31] = commonWords(name1, name2); int i = 0; while (common[i++] != NULL) { printf("%s\n", common[i]); } } 动态分配最多10个长度为calloc的常用字(定义为31)。有没有办法不预先声明常用字的数量(即数组的第一个维度)?为什么我会收到此错误?这个问题有更优雅的解决方案吗?

2 个答案:

答案 0 :(得分:0)

你错了。

首先,如果要拥有2D动态数组样式,请使用指向指针的指针。 请记住,这不是2D阵列!

Buffer

然后为指针分配内存:

char ** commWords;

然后,对于每个单词,分配单独的内存

//Allocate memory for 10 pointers to char
commWords = malloc(sizeof(*commWords) * 10); 

然后按预期使用已分配的内存。

答案 1 :(得分:0)

您的代码中存在许多问题:

  • 数组数组(也称为2D数组)与指向数组的指针数组不同。混合2是不正确的并且必然会失败。

  • commonmain的定义不正确:char commWords[][] = (char**)calloc(10, SIZE);。你可以这样修理它:

    char (*commWords)[SIZE] = calloc(sizeof(*commWords), 10);
    

    但其余的代码与commWords是一个2D数组是不一致的,定义commonWords()以返回指向数组数组的指针的语法会非常复杂。

    < / LI>
  • 打印常用字符串的while循环也是假的:在i语句中使用printf()之前,请先增加strspn()

这是一种更经典的方法来实现您的目标,使用指向字符串的指针数组,以及标准但很少使用的函数strcspn()#include <stdio.h> #include <stdlib.h> #include <string.h> void freeWords(char **arr) { if (arr) { for (size_t i = 0; arr[i]; i++) { free(arr[i]); } free(arr); } } /* return a NULL terminated array of strings or NULL upon memory allocation failure */ char **commonWords(const char *str1, const char *str2) { size_t n = 0; char **common = calloc(sizeof(*common), n + 1); size_t pos1, len1, pos2, len2; if (common == NULL) return NULL; /* failure */ common[0] = NULL; for (pos1 = 0;;) { pos1 += strspn(str1 + pos1, " "); if (str1[pos1] == '\0') break; len1 = strcspn(str1 + pos1, " "); for (pos2 = 0;;) { pos2 += strspn(str2 + pos2, " "); if (str2[pos2] == '\0') break; len2 = strcspn(str2 + pos2, " "); if (len1 == len2 && !memcmp(str1 + pos1, str2 + pos2, len1)) { char *w = calloc(sizeof(*w), len1 + 1); if (w == NULL) { freeWords(common); return NULL; } char **p = realloc(common, sizeof(*p) * (n + 2)); if (!p) { free(w); freeWords(common); return NULL; } common = p; memcpy(w, str1 + pos1, len1); common[n++] = w; common[n] = NULL; break; } pos2 += len2; } pos1 += len1; } return common; } int main(void) { const char *name1 = "abc def ghi"; const char *name2 = "ghi abc jkl"; char **common = commonWords(name1, name2); if (common) { for (size_t i = 0; common[i] != NULL; i++) { printf("%s\n", common[i]); } freeWords(common); } return 0; }

<?php

/**
 * Class Yii
 * @method static CApplication app()
 */
class Yii extends YiiBase
{
}

/**
 * Class CApplication
 *
 * @property User $user
 */
class CApplication extends CModule
{
}