动态指针值分配

时间:2011-06-08 05:24:11

标签: c pointers

我有一个指向数组的指针,该数组在运行时动态填充。收集并存储数组后,我希望数组的所有剩余缓冲区位置都填充空白区域。我怎么能这样做?


来自一些评论:

  

这就是我所拥有的:

 char buf[50];
 char *ptr = buf;
 strncpy(ptr, info.a, strlen(info.a));
 ptr += strlen(info.a);
 strncpy(ptr, info.b, strlen(info.b));
 ptr += strlen(info.b);
 strncpy(ptr, info.c, strlen(info.c));
 ptr += strlen(info.c);
  

如何使用' '填充剩余的指针位置?

3 个答案:

答案 0 :(得分:3)

您可以使用memset(3)用空格填充内存区域:

size_t total_size = get_total_size(); // total size of array, in bytes
size_t len = get_len(); // length of content, in bytes, <= total_size
assert(len <= total_size);
char *array = malloc(total_size);
// ... fill the first len bytes with your data
memset(&array[len], ' ', total_size - len); // and the rest to ' ' chars

虽然这样的方法存在一些问题。首先,除非您仔细检查len < total_size,否则您很容易受到缓冲区溢出的影响。其次,听起来你将把它作为字符串使用,在这种情况下,你要注意留下一个尾随的空值&#39; \ 0&#39;字符。

答案 1 :(得分:1)

这是我从你的问题中解释的

int Array[20];
int *p=Array;
int no,i,len;
char ch=' '; 
len=sizeof(Array)/sizeof(int)
printf("Enter no of elements "); 
scanf("%d",&no);
for(i=0;i<no;i++)
    scanf("%d",p+i);   
for(i=no;i<len;i++)
    p[i]=(int )ch;

希望这有帮助。

答案 2 :(得分:0)

我认为最简单的方法是在分配数组并将 ptr 分配到 buf 的开头之后。只需使用memset() {/ 1}}填写' '所有内容。

 char buf[50];
 char *ptr = buf;
 memset (ptr, ' ', sizeof(buf)); // like this

 // If this buffer is meant to be printed to the screen or used as a string,
 // it's probably better to write the end-of-string character at the last 
 // position of the buffer:
 buf[49] = 0;

 // operations to write stuff on the buffer

因此,在您的操作结束时,缓冲区中尚未使用的所有剩余位置将具有' '

修改

我一直在考虑你问的问题,除非你有非常具体的理由用空格填充数组,这通常不是我们如何处理这种情况(请查看我在这个答案下面的评论)

char* tmp_string = "**Copy Me**";
printf("Size of string:%d\n", strlen(tmp_string));

char buf[50];
printf("Size of buf:%d\n", sizeof(buf));
memset(buf, 0, sizeof(buf)); // cleaning the entire buffer

char *ptr = buf;
strncpy(ptr, tmp_string, strlen(tmp_string));
ptr += strlen(tmp_string);
*ptr = '!';

printf("Size of buf after copy: %d\n", strlen(buf));
printf("Result: %s\n", buf);

<强>输出:

Size of string:11
Size of buf:50
Size of buf after copy: 12
Result: **Copy Me**!

注意复制后buf的大小为12.这是因为我们在操作开始时将缓冲区归零(即用\0填充缓冲区)。在缓冲区\0的第一个符号处,printf()停止迭代数组并打印字符。

,我可以想到为什么你不想要这种方法的一个很好的理由。以下是对上述代码的略微修改。它使用空格填充缓冲区,并在缓冲区的最后位置添加字符串结尾字符(\0)。 注意,最后字符串的大小不是12!它是 49 ,因为您使用有效字符填充了缓冲区。

char* tmp_string = "**Copy Me**";
printf("Size of string:%d\n", strlen(tmp_string));

char buf[50];
printf("Size of buf:%d\n", sizeof(buf));
memset(buf, ' ', sizeof(buf)); // cleaning the entire buffer with empty spaces
buf[49] = 0; // setting a \0 at the end of the string

char *ptr = buf;
strncpy(ptr, tmp_string, strlen(tmp_string));
ptr += strlen(tmp_string);
*ptr = '!';

printf("Size of buf after copy: %d\n", strlen(buf));

printf("Result: %s\n", buf);

输出:

Size of string:11
Size of buf:50
Size of buf after copy: 49
Result: **Copy Me**!