动态内存分配

我在为数组动态分配内存时遇到了麻烦。 我已经调试了几个小时,没有任何指针?

我发布了剩下的代码。 它应该简单地将交换第一行与第二行交换,第三行与第四行交换。 我得到了奇怪的结果,如:

输入字符串:hello

输入字符串:你好吗?

输入字符串:我很好,谢谢

输入字符串:再见

输入字符串:bai

输入字符串:xx

=========================

你好吗

!我很好谢谢

你好

!你好吗

再见

!白

我很好谢谢

!再见

!XX

int count = 0; char *lines[MAX_LINES]; char *tmp[50]; printf("Enter string: "); fgets(tmp, 50, stdin); lines[count] = (char *) malloc((strlen(tmp)+1) * sizeof(char)); strcpy(lines[count], tmp); while(strcmp("xx\n", lines[count])){ count++; printf("Enter string: "); fgets(tmp, 50, stdin); lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char)); strcpy(lines[count], tmp); } void exchange(char * records[]) { char * temp; temp = records[0]; records[0] = records[1]; records[1] = temp; temp = records[2]; records[2] = records[3]; records[3] = temp; } void printArray(char * inputs[], int row, int col) { int i, j; for(i = 0; i < row; i++){ for(j = 0; j < col; j++){ printf("%c", inputs[i][j]); } } } 

这段代码似乎有效:

 #include  #include  #include  enum { MAX_LINES = 50 }; static void printArray(char *inputs[], int rows); static int readLine(char *buffer, size_t buflen); int main(void) { int count = 0; char *lines[MAX_LINES]; char tmp[50]; for (count = 0; count < MAX_LINES; count++) { if (readLine(tmp, sizeof(tmp)) == EOF) break; lines[count] = (char *) malloc((strlen(tmp)+1)* sizeof(char)); if (lines[count] == 0) break; strcpy(lines[count], tmp); } putchar('\n'); printArray(lines, count); return(0); } static int read_line(char *buffer, size_t buflen) { printf("Enter string: "); if (fgets(buffer, buflen, stdin) == 0 || strcmp("xx\n", buffer) == 0) return EOF; return 0; } static void printArray(char *inputs[], int rows) { for (int i = 0; i < rows; i++) printf("%d: %s", i, inputs[i]); } 

样品运行1(使用EOF):

 $ ./rl Enter string: Abyssinia Enter string: Wimbledon Common Enter string: ^D 0: Abyssinia 1: Wimbledon Common $ 

示例运行2(使用' xx '):

 $ ./rl Enter string: Abyssinia Enter string: Wimbledon Common Enter string: Strawberry Lemonade Enter string: xx 0: Abyssinia 1: Wimbledon Common 2: Strawberry Lemonade $ 

有什么不同? 我修正了tmp的类型,如评论中所述。 我创建了一个函数readLine()来管理提示并读取和比较"xx\n"进程以避免重复。 我避免使用strdup()但是在使用返回的指针之前检查malloc()成功。 我确保读入的行数不会太多( for循环)。 printArray()代码只获取行数,因为字符串的长度各不相同。 我删除了exchange()函数,因为它没有被使用,我看不出应该如何使用它。 代码完整且可编译(因此它是SSCCE - 简短,自包含,正确的示例 )。