动态内存分配
我在为数组动态分配内存时遇到了麻烦。 我已经调试了几个小时,没有任何指针?
我发布了剩下的代码。 它应该简单地将交换第一行与第二行交换,第三行与第四行交换。 我得到了奇怪的结果,如:
输入字符串: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 - 简短,自包含,正确的示例 )。