CHAR Array - stuffed with values - with more size than it holds


 
Thread Tools Search this Thread
Top Forums Programming CHAR Array - stuffed with values - with more size than it holds
# 1  
Old 02-14-2008
CHAR Array - stuffed with values - with more size than it holds

Hi All
I am simulating a problem in the production where i faced a situation.
Please find the following example program which i simulated.


#include<stdio.h>

#include<stdlib.h>

#include<string.h>



int main()

{



char str1[20];

char str2[20];

double t1=0.0;

double output_value=888.00;

double count=0.0;

memset(str1,0x00,20);

memset(str2,0x00,20);

char output_str[20];

char output_str1[20];

memset(output_str,0x00,20);

memset(output_str1,0x00,20);

for(int i=0;i<50;i++) (Purposely specifying as 50 and not 20 as per the variable)

{

count=count+1.0;

sprintf(output_str, "%12.2f", count); (When str1 is exhausted i.e after 20th byte it is taking the value from str2 mentioned below)

strcat(str1,output_str);

strcat(str1, " ");

printf("The string length of str1=%d\n",strlen(str1));



if (i != 0)

output_value= 1 + output_value;

sprintf(output_str1, "%12.2f", output_value);

strcat(str2, output_str1);

strcat(str2, " ");



printf("The str1 has the value =%s\n\n",str1);

printf("The str2 has the value =%s\n\n",str2);



}



printf("\n\n\n The output line 3=%s\n",str1);







}



Please let me know if str1 is stuffed more than what it can hold, should it take the values from str2 ? as arrays are stored by contiguous memory location.
# 2  
Old 02-14-2008
You are asking what happens with string overflow. Some systems have kernel traps to prevent it. But normally, the overflow goes into the stack down toward the start of the next variable
Code:
#include <stdlib.h>
int main(int argc, char **argv)
{
	char a[3]={0x0};
	char b[3]={0x0};
	char c[3]={0x0};
	int i=0;

	for(i=0; i<atoi(argv[1]);i++) b[i]=i+48;
	printf("iterations=%d ", atoi(argv[1]) );
	printf("a=%s b=%s c=%s ", a,b,c);
	printf("addr a=%x addr b=%x addr c=%x\n", a,b,c);
	return 0;

}

output
Quote:
csadev:/home/jmcnama> cc test.c
csadev:/home/jmcnama> a.out 8
iterations=8 a= b=01234567 c= addr a=705f1138 addr b=705f1140 addr c=705f1148

csadev:/home/jmcnama> a.out 9
iterations=9 a= b=012345678 c=8 addr a=705f1138 addr b=705f1140 addr c=705f1148

csadev:/home/jmcnama> a.out 4
iterations=4 a= b=0123 c= addr a=705f1138 addr b=705f1140 addr c=705f1148
csadev:/home/jmcnama>
Once you write enough characters it starts to write in variable "c" memory. char is normally memory aligned on the stack to a word boundary - on this system 8 bytes.
While variables are contiguous in a sense, they can have filler between them.
# 3  
Old 02-14-2008
CHAR Array - stuffed with values - with more size than it holds

Hi
From your example i understand that only 8 bytes are stored in variable b and the 9th byte is stored in c (while we try to write it in b).

Correct me if my understanding is wrong.

My point here is ....
(to the point in my example)

char str1[20];
char str2[20;

if str1 is overflowed and str2 is also in the process of adding values to it.
At a point where str1 is overflowed the next value i.e 21st position will point to the location of str2[0] ??

Let me know if you are unable to understand.

Regards
Dhanamurthy
# 4  
Old 02-14-2008
*I understood from the beginning. I said they are not truly contiguous in memory.
Why? they are 20 chars long. 20 % 8 == 4 There are 4 bytes between them. Very probably.

The first position in memory after str1 (str1["21"] which does not really exist) is very likely NOT str2[0].

Why only very likely NOT true?

How things are positioned in memory is implementation dependent. So I cannot guarantee where str1 and str2 live in memory because you may be running a non-standard compiler or running in a special unix environment.

In the environments I do know they will not be back-to-front in memory. There will be a gap. Why don't you just modify my code and see?
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Advanced & Expert Users

File command return wrong filetype while file holds group separator char.

hi, I am trying to get the FileType using the File command. I have one file, which holds Group separator along with ASCII character. It's a Text file. But when I ran the File command the FileType is coming as "data". It should be "ASCII, Text file". Is the latest version of File... (6 Replies)
Discussion started by: Arpitak29
6 Replies

2. Programming

Returning char array

I want to return a char array to the main() function, but its returning garbage value. #include<stdio.h> //#include<conio.h> #include<string.h> char* strtrmm(); int main() { char str1,c1; printf("\n Enter the string:"); gets(str1); //strtrmm(str1); printf("%s",strtrmm(str1));... (2 Replies)
Discussion started by: zinat
2 Replies

3. Programming

char array

cat int.c int main() { unsigned char wwn; wwn=50; wwn=00; wwn=53; wwn=30; wwn=08; wwn=09; wwn=82; wwn=17; printf("WWN: %02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x\n ", wwn, wwn, wwn, wwn, wwn,... (8 Replies)
Discussion started by: powyama
8 Replies

4. Programming

help with char pointer array in C

i have an array like #define NUM 8 .... new_socket_fd = accept(socket_fd, (struct sockaddr *) &cli_addr, &client_length); char *items = {"one", "two", "three", "four", "five", "six", "seven", "eight"}; char *item_name_length = {"3", "3", "5", "4", "4", "3", "5", "5"}; ... (1 Reply)
Discussion started by: omega666
1 Replies

5. Programming

Array of char

I'm doing some coding in C++ Want to have a long empty string like below const char ModMisfit :: DelStr = "\r \r"; However due to the long blank the line is very long. Is there any way to avoid this and keep the... (5 Replies)
Discussion started by: kristinu
5 Replies

6. Shell Programming and Scripting

PHP: Search Multi-Dimensional(nested) array and export values of currenly worked on array.

Hi All, I'm writing a nagios check that will see if our ldap servers are in sync... I got the status data into a nested array, I would like to search key of each array and if "OK" is NOT present, echo other key=>values in the current array to a variable so...eg...let take the single array... (1 Reply)
Discussion started by: zeekblack
1 Replies

7. Programming

size of char array in c

i have to store a data more than 100000. i don't know the size of the data whether it may be 100000 or 1000000. so how can i define variable size; example char abc; but i don't know the size so how can i give array size?? in one sentence how can i give the array size dynamically so that i... (6 Replies)
Discussion started by: phani_sree
6 Replies

8. Programming

char array

hi, I have variable like, char keyword = "TRANSPARENCY "; while passing this variable to some function, first character of variable becomes null, but rest of characters still exist. Why this happens or something wrong with declaration. Their is no error while compiling & running... (2 Replies)
Discussion started by: avadhani
2 Replies

9. Programming

char array problem

hello i have a program in C (Unix - SOlaris5.7), and i have the next question: i have a lot of char variable, and i want store their values in a char array. The problem is what i donīt know how to put the char variable's value into the array, and i don`t know how to define the array please... (4 Replies)
Discussion started by: DebianJ
4 Replies

10. Programming

size of a char devices

hi i want to write a simple io-benchmark for raw devices, especially for harddisks, vx-volumes and md-volumes on solaris. is there a unix system call to get the size of the device? the 'stat' system call reports the size for regaular files but not for block or devices. On Solaris the... (2 Replies)
Discussion started by: guenter
2 Replies
Login or Register to Ask a Question