1

我在尝试将一个指向数组的指针分配给另一个指向数组的指针时遇到问题,请你告诉我下面代码中的问题在哪里:

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    for(j = i + 1; j < 10 && *(pt + j) != NULL; j++)
     if(strlen(*(pt + i)) < strlen(*(pt + j))){
       temp = *(pt + i);
       *(pt + i) = *(pt + j);
       *(pt + j) = temp;
     }

  for(i = 0; i < 10 && *(pt + i) != NULL; i++)
    puts(*(pt + i)); 

}

编译到此函数时,GCC 返回“分配不兼容的类型”错误。问题一定很明显,但我只是一个新手,我自己找不到问题。

4

2 回答 2

1

这是导致错误的行吗?看起来像。(你应该在你的问题中指出。)

*(pt + j) = temp;

pt是类型char (*pt)[81]并且temp是相同类型。pt但是当你这样做时你取消引用*(pt + j)。(*取消引用指针,而是引用指针指向的变量。)

结果,*(pt + j)是类型char[81]。这就是为什么分配temp给它是错误的。

如果您知道自己在做什么,则可以通过类型转换来解决这个问题。但看起来这不是你所期望的,所以我不建议这样做。

于 2013-01-09T04:34:39.670 回答
0

如果我们使用下标符号而不是*(pt+i).

void sort_strlen(char (*pt)[81]){

  char (*temp)[81];
  int i, j;

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    for(j = i + 1; j < 10 && pt[j] != NULL; j++)
     if(strlen(pt[i]) < strlen(pt[j])){
       temp = pt[i];
       pt[i] = pt[j];
       pt[j] = temp;
     }

  for(i = 0; i < 10 && pt[i] != NULL; i++)
    puts(pt[i]); 

}

因此,当您尝试交换pt[i]andpt[j]时,首先尝试将 a char*(在char[81] pt[i]此处自动转换为)分配给行char(*)[81]中的a temp = pt[i];

类型不兼容在这里应该很清楚。但通常,这只是一个警告并且“按预期工作”,因为pt[i]它被转换为该字符串中第一个字节的地址,这也是数组的地址pt[i]&pt[i]如果通过分配或调整右侧的类型,警告将消失pt + i

错误在下一行。在该pt[i] = pt[j];行中,您尝试将 a 分配char*给 a char[81],在该pt[j] = temp;行中,您尝试将 a 分配char(*)[81]给 a char[81]

数组是不可赋值的,所以写

pt[i] = ...

总是一个错误。不幸的是,gcc 报告为

sort_strlen.c:13:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char *’
sort_strlen.c:14:18: error: incompatible types when assigning to type ‘char[81]’ from type ‘char (*)[81]’

而不是更直接地指出根本原因

sort_strlen.c:13:18: error: array type 'char [81]' is not assignable
       *(pt + i) = *(pt + j);
       ~~~~~~~~~ ^
sort_strlen.c:14:18: error: array type 'char [81]' is not assignable            
       *(pt + j) = temp;
       ~~~~~~~~~ ^

那铿锵的声音。gcc 报告的“不兼容类型”主要是无法修复的,因为右侧没有类型与赋值左侧的数组类型兼容。

我通过创建一个指针数组解决了这个问题。我想通过更改数组内的地址来直接对字符串进行排序。有谁知道这是否可能?最好的方法是什么?

这取决于你想做什么。您不能在不移动字符串本身的情况下更改字符串的地址,例如,您可以这样做

char temp[81];
...
    strcpy(temp, pt[i]);
    strcpy(pt[i], pt[j]);
    strcpy(pt[j], temp);

如果您不想移动字符串,您确实最好创建一个指针数组

char *strings[10];
for(int i = 0; i < 10; ++i) {
    strings[i] = pt[i];  // make it &pt[i][0] if you don't like the implicit conversion
}

strings并按字符串长度对数组进行排序:

char *temp;
...
    if (strlen(strings[i]) < strlen(strings[j])) {
        temp = strings[i];
        strings[i] = strings[j];
        strings[j] = temp;
    }
于 2013-01-09T16:23:39.177 回答