0

我遇到了一个非常奇怪的指针问题。正如您从下面的代码中看到的那样,我正在使用一种生成随机 4 x 4 字符网格的方法。它返回一个指向二维字符数组的指针。问题是当我尝试将返回的指针分配给另一个指针并尝试打印生成的网格时,我只得到一个奇怪的符号。

头文件

#import <Foundation/Foundation.h>

@interface GridGenerator : NSObject
{
}
-(char (*)[4]) generateGrid;
-(int (*)[2]) bbb;
-(void) print;
@end

实施文件

#import "GridGenerator.h"

@implementation GridGenerator
-(char (*)[4])generateGrid{
    char vowels[6] = {'A','E','I','O','U','Y'};
    char consonants[20] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
    char grid[4][4];
    int vowelsLength = (sizeof vowels / sizeof vowels[0]);
    int consLength = (sizeof consonants / sizeof consonants[0]);
    int gridSize = (sizeof grid / sizeof grid[0]);
    for(int i=0;i<gridSize;i++){
        int vowelsInGridRow = 0;
        int noOfVowels = (arc4random() % 2) + 1;
        for(int j=0;j<gridSize;j++){
            if(noOfVowels != vowelsInGridRow){
                int vowIndex = arc4random() % vowelsLength;
                char s = vowels[vowIndex];
                grid[i][j] = s;
                vowelsInGridRow++;
            }
            else{
                int consIndex = arc4random() % consLength;
                char s = consonants[consIndex];
                grid[i][j] = s;
            }
        }
    }


    char (*sd)[4]= grid;
    return sd;      
}
-(void)print{
    char (*grid)[4] = [self generateGrid];
    NSString *s = @"\n";
    for(int i=0;i<4;i++){
        for(int j=0;j<4;j++){
            s = [s stringByAppendingString:[NSString stringWithFormat:@"%c",grid[i][j]]];

        }
        s = [s stringByAppendingString:@"\n"];
    }
    NSLog(@"%@",s);
}

主文件(测试)

#import <Foundation/Foundation.h>
#import "Crossword.h"
#import "GridGenerator.h"
int main(int argc, const char * argv[])
{

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    GridGenerator *gen = [[GridGenerator alloc] init];

    [gen print];
    [pool release];
    return 0;
}

当我运行代码时,您可以看到下面的结果。在“U”之后有一个倒置的问号(此处不能粘贴)。

2013-06-02 11:24:29.923 填字游戏[646:303]
ü

你有什么想法,什么可能导致这种情况发生?我已经挣扎了几个小时,我找不到任何解释。

4

1 回答 1

2

您正在返回对临时的引用。应该会发生爆炸(未定义的行为)。

解决方法。创建一个结构:

typedef struct {char at[4][4];} t_grid;

然后填充并返回t_grid按值:

- (t_grid)generateGrid
{
  char vowels[6] = {'A','E','I','O','U','Y'};
  char consonants[20] = {'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z'};
  t_grid grid;
  ...
  int gridSize = (sizeof grid.at / sizeof grid.at[0]);
  ...
    grid.at[i][j] = s;
  ...
  return grid;
}


- (void)print
{
  t_grid grid = [self generateGrid];
  ...

请注意,您不应将此方法用于大型数组或可变长度数组。4*4 八位字节很小。

于 2013-06-02T09:36:27.690 回答