C编程增加字符串的大小

时间:2013-06-25 15:14:51

标签: c

所以我写了这段代码,但它每次都给我相同的答案。我以4为步长增加分配给指针的内存,然后打印该值。

#include <stdio.h>

int main(void) {
    int n=0;
    char *name = "hello";
    scanf("%d",&n);

    for(int i =0; i<n;i++){
        name += sizeof(int);
        printf("%d \n", (sizeof(&name)));
    }
    return 0;
}
有人能帮帮我吗?我不知道这里有什么不对。我不需要不同的代码,我只想了解这有什么问题。

4 个答案:

答案 0 :(得分:2)

尝试以下操作,为清楚起见,省略了错误检查:

#include <stdio.h>
int main(void) 
{
    int n=0;
    char *name = null;
    scanf("%d",&n);

    for(int i=0; i<n;i++)
    {
        char *buffer = null;
        //allocate/reallocate the buffer. increases by 4 bytes every iteration
        buffer = (char*) realloc(name, (i+1)*4);
        name = buffer;
        printf("%d \n", (sizeof(&name)));
    }
    //release the memory used by the buffer
    free(name);
    return 0;
}

答案 1 :(得分:2)

以下是对正在发生的事情的一些解释。

#include <stdio.h>

int main(void) {
    int n=0;

        // this does not actually allocate any memory. It sets the POINTER name to point (like an arrow) to a read-only block that contains "hello"
    char *name = "hello";
        // string literals generally come in fixed read-only memory

    scanf("%d",&n);

    for(int i =0; i<n;i++){
            // this causes the pointer memory address to be incremented by sizeof(int) (typically 4)
            // after the first increment if it will point to a string "o" (incremented by 4 characters)
            // after the second increment it will point to some undefined memory behind "hello" in your virtual address space and will have undefined behaviour when accessed
        name += sizeof(int);

            // sizeof(&name) will give you the size of a char **. Pointer to a character pointer. 
            // Wich is the same size as all pointers.
            // = sizeof(void *) = 8 for 64-bit systems, 4 for 32-bit systems
        printf("%d \n", (sizeof(&name)));
    }
    return 0;
}

这是做到这一点的方法:

#include <stdio.h>

int main(void) {
    int n=0;

    // allocate 10 bytes of memory and assign that memory address to name
    char *name = malloc(10);
    // the size of that memory needs to be kept in a separate variable
    size_t name_length = 10;

    // copy the desired contents into that memory
    memcpy(name, "hello", sizeof("hello"));

    scanf("%d",&n);

    for(int i =0; i<n;i++){

        // reallocate the memory into something with sizeof(int) more bytes
        void * tmp = realloc(name, name_length += sizeof(int));
        // this can fail
        if (tmp) {
            name = tmp;
        } else {
            perror("realloc");
            exit(-1);
        }

        printf("%d \n", name_length);
    }
    return 0;
}

答案 2 :(得分:0)

您在提供的代码中根本没有为指针分配任何内存。如果要更改已分配块的大小,则必须处理动态内存。您必须先使用malloc,然后使用realloc为每一步分配更多内存。

答案 3 :(得分:0)

让我们逐一介绍您的代码:

char *name = "hello"; 

这会创建一个字符数组'h','e','l','l','o',0并指定第一个字符的内存地址来命名

for(int i =0; i<n;i++){
    name += sizeof(int);
    printf("%d \n", (sizeof(&name)));
}

这里你添加了int指针大小的名称指针,每次传递都会使这个指针增加4。

由于这是一个char指针,指针增加4个字节 - 从sizeof(int) == 4

开始

您不能增加hello char数组的大小,因为它不是动态数组。

如果你希望能够调整字符串的大小,你应该malloc并将字符复制到更大的数组。