动态内存分配

时间:2013-07-03 22:41:30

标签: c arrays memory dynamic allocation

我无法为数组动态分配内存。我已经调试好几个小时了,还有什么指针?

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

输入字符串:hello

输入字符串:你好吗

输入字符串:我很感谢

输入字符串:bye

输入字符串:bai

输入字符串:xx

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

你好吗

!我很感谢

您好

!你好吗

再见

!白

我很感谢

!再见

bai

!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]);
        }

    }
}   

1 个答案:

答案 0 :(得分:0)

此代码似乎有效:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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 - Short, Self-Contained, Correct Example)。