0

任意の配列を反転するコードを書きました。これは最初から最後まで意味がありますが、char 型では機能しません。任意の配列 (int、float、char) を元に戻すコードをどのように記述すればよいでしょうか? たとえば、元の配列は次のとおりです: 1,2,3,4,5,6,7,8,9,10 実行後、配列は次のようになります: 10,9,8,7,6,5,4,3 ,2,1

私のコード:

#include <stdio.h>

#define SIZE 10

void reverseArr ( void *arr, unsigned size);

void main ()
{

    char a[SIZE] = {'a','b','c','d','e', 'f', 'g', 'h', 'i', 'j'};

    reverseArr (a, SIZE);

}

void reverseArr ( void *arr, unsigned size)
{
    int *start, *end, temp;

    start=(int*)arr;
    end=(int*)arr+9;

    while (start<end)
    {
        temp=*start;
        *start=*end;
        *end=temp;
        start++;
        end--;
    }
}
4

2 に答える 2

5

voidポインターをポインターにキャストしintます。

sizeof(char) < sizeof(int)おそらくあなたのプラットフォームで。したがって、配列 char を char ごとにトラバースしません。

要素のサイズを渡さずに、そのような一般的な関数を書くことはできません。

void reverseArr ( void *arr, unsigned len_array, unsigned size_element)
{
  char* start = (char*) arr;

  ....
  start += size_element;
  ....
}

設計上、sizeof(char) == 1へのポインターを使用してバッファーをトラバースできるためcharです。の指示に従って、適切な数の文字を移動するだけsizeof(type)です。

reverseArr (a, SIZE, sizeof(a[0]));
于 2013-04-09T16:06:49.480 に答える
0

ポイントは、この配列が保持する要素の型を知る必要があるということです。ポインタを進める演算子は、特定の仮定を行います - 次の要素はsizeof(type)さらにメモリバイトにあります。

ジェネリック バージョンを作成する場合は、sizeof 要素を渡し、適切なポインター演算を行う必要があります。

于 2013-04-09T16:08:43.830 に答える