繁体   English   中英

子字符串的指针从字符串的指针

[英]Pointer of substring from pointer of string

我对C还是很陌生,并在以下方面作斗争。

考虑一个字符串(指向字符数组的指针),其中包含任意数量的无符号字节,在我们的示例中,将其设置为programming 编写一个函数,该函数返回一个指向内存中位置的指针(但未使用malloc分配),该malloc包含任意大小但固定大小的子字符串,且具有任意偏移量-在本例中为gramm

我尝试了以下方法:

unsigned char* newptr(unsigned char* p, int offset, int size) {
    unsigned char r[size];
    memcpy(r, p + offset, size + 1);
    return r;
}

但由于Segmentation fault而出错。 除此以外

unsigned char* newptr = oldptr + offset;

可以工作,但不能解决固定大小的问题-我不希望其余字符属于指针。

在此先感谢您,如果您之前提出过这个问题,对不起,我什么也找不到帮助。

一些可能的解决方案,它们都不是最优的:

使用全局缓冲区 (使用全局变量是一种不好的做法,如果再次调用该函数,它将重写缓冲区,缓冲区的大小固定,并且必须大于您的大小):

unsigned char r[100000];

unsigned char* newptr(unsigned char* p, int offset, int size) {
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
 }

使用静态本地缓冲区 (与使用全局缓冲区的解决方案几乎存在相同的问题):

unsigned char* newptr(unsigned char* p, int offset, int size) {
    static unsigned char r[100000];        
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
}

将输入变量的内存用作缓冲区(问题是* p在函数调用后发生更改)

unsigned char* newptr(unsigned char* p, int offset, int size) {
    p[offset + size] = '\0';
    return p + offset;
}

将分配的缓冲区传递给函数:

unsigned char* newptr(unsigned char* p, int offset, int size, unsigned int* r) {
    memcpy(r, p + offset, size);
    r[size] = '\0';
    return r;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM