我对C很陌生,并且对以下内容感到困惑。
考虑一个字符串(指向字符数组的指针),包含任意数量的无符号字节,在我们的例子中,让它为
programming
。编写一个函数,它返回一个指向内存中 new 位置的指针(但没有用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;
有效,但它没有解决固定大小的问题 - 我不希望其余的字符属于指针。
提前致谢,如果之前提出过这个问题,我很抱歉,我无法找到任何帮助。
答案 0 :(得分:0)
一些可能的解决方案,所有这些都是非最佳的:
使用全局缓冲区(使用全局变量是不好的做法,如果再次调用该函数,它会重写缓冲区,缓冲区的大小固定,并且必须大于您的大小):
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;
}